<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="de-CH">
    <title>nettigkeiten.ch</title>
    <link rel="self" type="application/atom+xml" href="http://blog.nettigkeiten.ch/Atom.aspx" />
    <subtitle type="html" />
    <id>http://blog.nettigkeiten.ch/Default.aspx</id>
    <author>
        <name>Dani</name>
        <uri>http://blog.nettigkeiten.ch/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 2.1.0.5">Subtext</generator>
    <updated>2009-03-25T23:11:19Z</updated>
    <entry>
        <title>Me, Myself and ReSharper #2: Live Templates</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2009/03/25/me_myself_and_resharper_2_live_templates.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2009/03/25/me_myself_and_resharper_2_live_templates.aspx</id>
        <published>2009-03-25T20:41:40Z</published>
        <updated>2009-03-25T23:11:19Z</updated>
        <content type="html">&lt;p&gt;Das Konzept der Live Templates ist dem der Visual Studio Code Snippets ähnlich. Live Templates ermöglichen es also, beliebige Code-Fragmente als Template zu hinterlegen, so dass diese einfach und schnell im Code wiederverwendet werden können.&lt;/p&gt;
&lt;p&gt;Der Resharper bringt hier schon einige von Haus aus mit:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_2.png" rel="lightbox"&gt;&lt;img height="290" border="0" width="248" style="border-width: 0px; display: inline;" title="image" alt="image" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Da gibt es solche darunter, die einem einfach etwas Tipparbeit sparen (aus “thr” resultiert “throw new “) und andere, die etwas aufwändigere Konstruktur kreieren, so entsteht aus “itdic” eine Iteration über ein Dictionary:    &lt;br /&gt;
&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_6.png" rel="lightbox"&gt;&lt;img height="145" border="0" width="382" style="border-width: 0px; display: inline;" title="image" alt="image" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_thumb_2.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Dabei sind die grün bzw. blau hinterlegten Bezeichnungen Platzhalter, welche mit TAB durchsprungen werden können – so hat man das eingefügt Snippet innert kürze für die jeweilige Situation angepasst. Resharper probiert bei der Wahl der Platzhalter jeweils auch herauszufinden, was man tun möchte. So leitet er aus meiner vorgängigen Initialisierung des dic-Dictionaries automatisch ab, dass ich wahrscheinlich darüber iterieren möchte, und dass dieses Dictionary einen Key vom Typ Integer und den Wert als String enthält.&lt;/p&gt;
&lt;p&gt;Wer sieht den Fehler? Genau, die Iterationsvariable ist vom Typ DictionaryEntry statt KeyValuePair und die Casts im Body sind überflüssig. Das heisst, dieses Live Template ist für die Verwendung mit “klassischen” Dictionaries gedacht, nicht aber für generische.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;h3&gt;Was nicht ist, kann ja noch werden&lt;/h3&gt;

&lt;p&gt;Und hier wirds erst richtig spassig. Live-Templates können auch ganz einfach selbst erstellt werden. Hierfür gibt es einen einfachen Editor, wo man sich die Live-Templates erstellen kann. Unser angepasstes Skript von oben sieht nun folgendermassen aus:&lt;/p&gt;
&lt;p&gt;&lt;img height="468" border="0" width="830" style="border: 0px none ; display: inline;" title="image" alt="image" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_13.png" /&gt; &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;Man definiert also das Template mit Platzhalter. Für diese wiederum kann man dann Makros definieren, welche dem Live Template eine gewisse Inteligenz mitgeben. So wird hier als Beispiel für den DICT-Platzhalter definiert, dass eine Variable vom Typ System.Collections.Generic.Dictionary vorgeschlagen werden soll. Dies veranlasst Resharper bei der Verwendung des Templates dann dazu, im Code nach einer entsprechenden Variable zu suchen.&lt;/p&gt;
&lt;p&gt;Wenden wir nun das Template auf unseren Code von oben an:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_10.png" rel="lightbox"&gt;&lt;img height="139" border="0" width="274" style="border-width: 0px; display: inline;" title="image" alt="image" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_thumb_4.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_12.png" rel="lightbox"&gt;&lt;img height="142" border="0" width="432" style="border-width: 0px; display: inline;" title="image" alt="image" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper2LiveTemplates_1195D/image_thumb_5.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Et voilà – nun passts perfekt. Die Typen werden korrekt erkannt und die Iterationsvariable hat jetzt auch den korrekten Datentyp. Nettes Gimmick dazu: Im eingeblendeten DropDown macht uns Resharper gleich noch Namensvorschläge die an dieser Stelle evtl. Sinn machen könnten.&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e7aa9c59-2eb5-4a6d-96d0-7b7a1fc28ab4" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://blog.nettigkeiten.ch/tags/Resharper/default.aspx" rel="tag"&gt;Resharper&lt;/a&gt;, &lt;a href="http://blog.nettigkeiten.ch/tags/Tools/default.aspx" rel="tag"&gt;Tools&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/225.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/225.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/225.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/225.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Me, Myself and ReSharper #1: Goto Member</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2009/01/21/me-myself-and-resharper-1-goto-member.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2009/01/21/me-myself-and-resharper-1-goto-member.aspx</id>
        <published>2009-01-21T22:55:44Z</published>
        <updated>2009-03-25T20:53:38Z</updated>
        <content type="html">&lt;p&gt;Der &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt; ist schon eine ganze Weile das erste Tool das mir nach der VS-Installation auf die Kiste kommt. Da ich immer wieder Fragen à la "Wozu braucht man den noch, VS kann ja auch Refactoring" höre, blogge ich nun in unregelmässigen Abständen über meine schönen Erlebnisse mit R# :-)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Mit ALT+&amp;lt; erhalt liefert mir R# eine Liste aller Members der gerade offenen Klasse:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper_14000/21.01_2.png"&gt;&lt;img height="167" border="0" width="363" style="border: 0px none ;" alt="21.01" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MeMyselfandReSharper_14000/21.01_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Wie man sieht lässt sich die Liste auch durchsuchen.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Tags: &lt;a href="http://blog.nettigkeiten.ch/tags/Resharper/default.aspx" rel="tag"&gt;Resharper&lt;/a&gt;, &lt;a href="http://blog.nettigkeiten.ch/tags/Tools/default.aspx" rel="tag"&gt;Tools&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/224.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/224.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/224.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/224.aspx</trackback:ping>
    </entry>
    <entry>
        <title>BDD - Expected Exceptions</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2009/01/04/bdd---expected-exceptions.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2009/01/04/bdd---expected-exceptions.aspx</id>
        <published>2009-01-04T01:06:54Z</published>
        <updated>2009-01-04T01:08:58Z</updated>
        <content type="html">&lt;p&gt;Wie testet man auf eine erwartete Exception im BDD-Style?&lt;/p&gt;  &lt;p&gt;Hier ein (etwas sinnfreies) Beispiel - auch hier das ganze wieder mit &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit&lt;/a&gt; und den &lt;a href="http://code.google.com/p/xunitbddextensions/"&gt;xUnitBddExtensions&lt;/a&gt;:&lt;/p&gt;  &lt;div&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; [Concern(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (Television))]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; when_Television_gets_turnOff_command_if_it_is_turned_off : InstanceContextSpecification&amp;lt;Television&amp;gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Action theTurnOffAction;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; Television CreateSut()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Television();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Because()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;         theTurnOffAction = The.Action(() =&amp;gt; Sut.TurnOff());&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;     [Observation]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Should_throw_an_NotYetTurnedOnException()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt;         theTurnOffAction.ShouldThrowAn&amp;lt;NotYetTurnedOnException&amp;gt;();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;In Zeile 13&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;theTurnOffAction = The.Action(() =&amp;gt; Sut.TurnOff());&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;wird ein Action-Delegate gespeichert, welches dann auf Zeile 19 im Hintergrund aufgerufen wird.&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;theTurnOffAction.ShouldThrowAn&amp;lt;NotYetTurnedOnException&amp;gt;();&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Ein weiteres Beispiel für schön lesbare und somit aussagekräftige Tests.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8dabe198-70b1-471f-9bdb-a419a736c5d4" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Tags: &lt;a href="http://blog.nettigkeiten.ch/tags/TDD/default.aspx" rel="tag"&gt;TDD&lt;/a&gt;, &lt;a href="http://blog.nettigkeiten.ch/tags/BDD/default.aspx" rel="tag"&gt;BDD&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/223.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/223.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/223.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/223.aspx</trackback:ping>
    </entry>
    <entry>
        <title>BDD - bin ich schon drin oder was?</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2009/01/03/bdd---bin-ich-schon-drin-oder-was.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2009/01/03/bdd---bin-ich-schon-drin-oder-was.aspx</id>
        <published>2009-01-03T23:38:59Z</published>
        <updated>2009-01-04T00:11:07Z</updated>
        <content type="html">Ich lese schon eine Weile bei &lt;a href="http://altdotnet.de"&gt;Alt.Net (DE)&lt;/a&gt; mit. In letzter Zeit war da immer mal wieder das Thema von BDD (Behaviour Driven Design) als Evolution zu TDD (Test Driven Design). Nachdem ich einige Zeilen darüber gelesen habe, war mir klar, dass das eine genauere Betrachtung verdient hat.   &lt;p&gt;Nachfolgender Artikel (und folgende) sollten nicht als Experten-Essay verstanden werden - vielmehr soll es Einsteigern helfen, die die gleichen Fehlüberlegungen machen und sich in die gleichen Sackgassen verrennen wie ich. Natürlich wär's auch schön, wenn ich von dem einen oder anderen Experten einen Schubs in die richtige Richtung erhalten würde. :-)&lt;/p&gt;  &lt;p&gt;Aber worum gehts denn nun überhaupt:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;TDD, BDD... WTF?&lt;/h3&gt;  &lt;p&gt;Wie bereits gesagt, ist BDD als Evolution und nicht etwa als Alternative zu TDD zu verstehen. Kurz gesagt: TDD stellt den Test in den Mittelpunkt, BDD das Verhalten (Behaviour). Auf den ersten Blick erscheinen BDD-Tests recht speziell. Die Klassen- und Test-Namen sind in sprechender Form gehalten. Das ist dann auch gleich einer der Hauptpunkte von BDD: die Sprache. BDD-Tests sollen in einer Sprache definiert sein, die auch ein Fach-Vertreter lesen und verstehen kann.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Hands On&lt;/h3&gt;  &lt;p&gt;Hier mal ein Beispiel: eine Klasse "Television" soll getestet werden. Es wird das Verhalten getestet, wenn der Fernseher eingeschaltet wird. &lt;/p&gt;  &lt;p&gt;Für das Beispiel wurde &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit&lt;/a&gt; mit den &lt;a href="http://code.google.com/p/xunitbddextensions/"&gt;xUnitBddExtensions&lt;/a&gt; von Björn Rochel verwendet. Diese beiden Frameworks erlauben es, den BDD-Gedanken bestmöglichst in Code umzusetzen.&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244,244,244)"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   1:&lt;/span&gt; [Concern(&lt;span style="color: rgb(0,0,255)"&gt;typeof&lt;/span&gt; (Television))]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   2:&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;class&lt;/span&gt; when_Television_turns_on : InstanceContextSpecification&amp;lt;Television&amp;gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   4:&lt;/span&gt;     &lt;span style="color: rgb(0,0,255)"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;override&lt;/span&gt; Television CreateSut()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   6:&lt;/span&gt;         &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; Television();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   8:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;   9:&lt;/span&gt;     &lt;span style="color: rgb(0,0,255)"&gt;protected&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;override&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; Because()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  11:&lt;/span&gt;         Sut.TurnOn();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  13:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  14:&lt;/span&gt;     [Observation]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  15:&lt;/span&gt;     &lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; Should_start_on_channel_one()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  16:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  17:&lt;/span&gt;         Sut.GetCurrentChannel().ShouldBeEqualTo(1);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  19:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  20:&lt;/span&gt;     [Observation]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  21:&lt;/span&gt;     &lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; Should_allow_to_turn_off()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  22:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  23:&lt;/span&gt;         Sut.TurnOff().ShouldBeTrue();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: rgb(244,244,244); border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  24:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas,'Courier New',courier,monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: rgb(96,96,96)"&gt;  25:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Die Basisklasse InstanceContextSpecification&amp;lt;T&amp;gt; wird vom xUnitBddExtensions-Framework bereitgestellt.&lt;/p&gt;

&lt;p&gt;In CreateSut (Sut = System under test), wird also die zu testende Instanz erstellt. Because stellt dann also den eigentlichen Grund des Testens dar, in diesem Falle also die TurnOn-Methode. Danach folgen zwei Observations, die eigentlichen Tests.&lt;/p&gt;

&lt;p&gt;Wenn man sich nun die Resultate in einem Testrunner anschaut, sieht man auch, wie sprechend das ganze jetzt daher kommt:&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/BDDbinichschondrinoderwas_968/03.01_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="103" alt="03.01" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/BDDbinichschondrinoderwas_968/03.01_thumb_1.png" width="512" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;So ein Bericht kann man gut auch jemandem von Fach vorlegen, ohne dass dieser die Stirn runzelt - ok, wenn noch alles rot ist so wie hier, vielleicht schon :-)&lt;/p&gt;

&lt;p&gt;Was man auch schön sieht ist, dass sich dieser Bericht wie das Inhaltsverzeichnis einer Spezifikation liest. Die Tests sind also viel näher bei den Anforderungen - auch sprachlich. Mein Eindruck war auch, dass sich Tests so einfacher identifizieren lassen.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;AAA&lt;/h3&gt;

&lt;p&gt;Und gleich nochmal so ein &lt;a href="http://en.wikipedia.org/wiki/Three-letter_acronym"&gt;TLA&lt;/a&gt; ;-) AAA steht für "Arrange Act Assert" und stellt ein Syntax-Pattern dar. In unserem Beispiel wurde der Test in genau drei solche Teile zerlegt:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;CreateSut (= Arrange) &lt;/li&gt;

  &lt;li&gt;Because (= Act) &lt;/li&gt;

  &lt;li&gt;Should_x (= Assert) &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Der Vorteil dieser Syntax ist, dass die verschiedenen Bereiche des Tests sauber voeinander getrennt sind - so können die Observations auf das wirklich Wesentliche (nämlich das Testen der Verhalten) reduziert werden.&lt;/p&gt;

&lt;p&gt;Ansatzweise ist das auch in den bekannten TestSetup-Verfahren von nUnit &amp;amp; Co. umgesetzt - allerdings wird dort das Act und Assert meist vermischt. Die &lt;a href="http://code.google.com/p/xunitbddextensions/"&gt;xUnitBddExtensions&lt;/a&gt; erlauben hier eine schöne Trennung und saubere Syntax.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Das war ein erster kleiner Einblick in BDD, welcher hoffentlich zum Einstieg einlädt. Ich kann es nur empfehlen. Wer damit starten möchte, dem möchte ich nochmals die &lt;a href="http://code.google.com/p/xunitbddextensions/"&gt;xUnitBddExtensions&lt;/a&gt; wärmstens ans Herz legen. Die Sourcen umfassen neben dem Framework auch noch zwei Templates für Resharper, welche die Test-Erstellung erleichtert. Ausserdem wurden die Extensions selbst mit BDD-Tests getestet, das heisst man hat dort schon jede Menge guter Samples drin.&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7c629084-62f4-459b-b2a4-3866a397824d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Tags: &lt;a href="http://blog.nettigkeiten.ch/tags/BDD/default.aspx" rel="tag"&gt;BDD&lt;/a&gt;, &lt;a href="http://blog.nettigkeiten.ch/tags/TDD/default.aspx" rel="tag"&gt;TDD&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/222.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/222.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/222.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/222.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Ohne Worte</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2008/12/06/ohne-worte.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2008/12/06/ohne-worte.aspx</id>
        <published>2008-12-06T11:36:36Z</published>
        <updated>2008-12-06T11:37:41Z</updated>
        <content type="html">&lt;p&gt;&lt;img height="591" alt="Taskman" width="679" src="/images/blog_nettigkeiten_ch/taskman.png" /&gt;&lt;/p&gt;
&lt;p&gt;Nein, kein 8-Core, aber zumindest 4 mit Hyperthreading - Core i7 machts möglich &lt;img alt="" src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/shades_smile.gif" /&gt;&lt;/p&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/221.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/221.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/221.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/221.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Mehrspaltige DropDownList / ListBox</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2008/10/02/mehrspaltige-dropdownlist--listbox.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2008/10/02/mehrspaltige-dropdownlist--listbox.aspx</id>
        <published>2008-10-02T20:49:02Z</published>
        <updated>2008-10-02T20:49:02Z</updated>
        <content type="html">&lt;p&gt;Eine doch lästige und unschöne Einschränkung bei der DropDownList ist doch, dass man nur ein Feld der DataSource an das Control binden kann. &lt;/p&gt;  &lt;p&gt;Oft will man halt aber mehr als nur ein Feld darstellen:&lt;/p&gt;  &lt;p&gt;Kategorie A: 3 Fahrzeuge&lt;/p&gt;  &lt;p&gt;Kategorie B: 11 Fahrzeuge&lt;/p&gt;  &lt;p&gt;Kategorie C: 1 Fahrzeug&lt;/p&gt;  &lt;p&gt;Natürlich geht das relativ problemlos, z.B. mittels String-Concatenation, ist aber doch lästig, wenn man sonst alles schön über direktes DataBinding lösen könnte – zumal das Control ja auch einen FormatString zur Steuerung der Ausgabe entgegennimmt.&lt;/p&gt;  &lt;p&gt;Eine Ableitung der DropDownList zu bauen, die das kann, ist zum Glück keine Kunst. Nachfolgend das Beispiel mit einer DropDown-List, die ListBox verhält sich analog.&lt;/p&gt;  &lt;p&gt;Zuerst erstellt man sich also eine Klasse, die von DropDownList erbt:&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MultiColumnDropDownList : DropDownList&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Die DropDownList nimmt den Namen des anzuzeigenden DataSource-Feldes im Property DataTextField auf. Ich benutze das Property gleich auch für meine Zwecke, lasse aber mehrere Angaben, getrennt durch ein Semikolon zu.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Die einzige Methode dies es dann zu überschreiben gilt ist PerformDataBinding. Dort kriegt man als Parameter die DataSource praktisch als IEnumerable.&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PerformDataBinding(System.Collections.IEnumerable dataSource)&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Die eigentliche Implementation ist dann denkbar simpel: &lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (Object obj &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; dataSource)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] textFieldsValues = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[textFields.Length];&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; textFields.Length; i++)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;         textFieldsValues[i] = DataBinder.GetPropertyValue(obj, textFields[i].Trim()).ToString();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;     ListItem li = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ListItem();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     li.Text = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(list.DataTextFormatString, textFieldsValues);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     li.Value = DataBinder.GetPropertyValue(obj, list.DataValueField);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     list.Items.Add(li);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;In Zeile 6 wird mittels der DataBinder-Klasse der Wert aus der DataSource gelesen. Hat den Vorteil, dass man sich nicht darum kümmern muss, was denn nun für eine DataSource dahinter steckt. Der Rest ist wohl selbsterklärend.&lt;/p&gt;

&lt;p&gt;Eingebunden in einer aspx-Seite sieht dann das so aus:&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &amp;lt;NN:MultiColumnDropDownList  ID=&lt;span style="color: #006080"&gt;"ddlMulti"&lt;/span&gt; runat=&lt;span style="color: #006080"&gt;"server"&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;             DataSourceID=&lt;span style="color: #006080"&gt;"ObjectDataSource1"&lt;/span&gt; DataTextField=&lt;span style="color: #006080"&gt;"Name;PreName"&lt;/span&gt; &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;             DataValueField=&lt;span style="color: #006080"&gt;"Id"&lt;/span&gt; DataTextFormatString=&lt;span style="color: #006080"&gt;"{0} {1}"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Und als Ausgabe:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MultiColumnDropDownList_13B0F/greenshot_2008-10-02_20-38-46_2.jpg" rel="lightbox"&gt;&lt;img title="greenshot_2008-10-02_20-38-46" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="68" alt="greenshot_2008-10-02_20-38-46" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/MultiColumnDropDownList_13B0F/greenshot_2008-10-02_20-38-46_thumb.jpg" width="115" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.nettigkeiten.ch/Files/MultiColumnList.zip"&gt;Download&lt;/a&gt; der Sourcen&lt;/p&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/219.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/219.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/219.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/219.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Herrlich! G&amp;ouml;ttlich!</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2008/10/02/herrlich-goumlttlich.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2008/10/02/herrlich-goumlttlich.aspx</id>
        <published>2008-10-02T18:29:28Z</published>
        <updated>2008-10-02T18:29:28Z</updated>
        <content type="html">&lt;p&gt;Leider hört man ja von Maradona eigentlich selten noch erfreuliches, das soll aber nicht daran hindern, sich an alten Perlen zu erfreuen. Auf so eine bin ich heute im &lt;a href="http://www.blick.ch/sport/fussball/saeugling-unterschreibt-bei-atletico-madrid-101807"&gt;Schweizer Schundblatt Nr. 1&lt;/a&gt; gestossen:&lt;/p&gt;  &lt;p&gt;   &lt;/p&gt;&lt;div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:cd882bb1-bd8d-407c-9adb-57e2ffaa2523" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div id="1c5bcd3d-6154-4176-8fec-06260bce1b05" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=bbaa2oTazMU" target="_new"&gt;&lt;img src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/HerrlichGttlich_10404/video2628ec8552d3.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('1c5bcd3d-6154-4176-8fec-06260bce1b05'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/bbaa2oTazMU&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/bbaa2oTazMU&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;p&gt;Da ist sogar das Einspielen ein Highlight!&lt;/p&gt;  &lt;p&gt;Perfekte Einstimmung für heute Abend, wenn der FC Zürich, zwar kaum so brilliant, aber hoffentlich mit viel Kämpferherz die Milanesi rauskickt. :-)&lt;/p&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/218.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/218.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/218.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/218.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Private Methoden mit UnitTests testen</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2008/09/30/private-methoden-mit-unittests-testen.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2008/09/30/private-methoden-mit-unittests-testen.aspx</id>
        <published>2008-09-30T21:29:34Z</published>
        <updated>2008-09-30T21:29:34Z</updated>
        <content type="html">&lt;p&gt;Das Testen von privaten Methoden wirft immer wieder Fragen auf. Natürlich gibt es hierfür auch diverse Lösungen:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visual Studio erstellt einen sogenannten Private Accessor, was schlussendlich nichts anderes als ein Wrapper ist, der mittels Reflection auf die privaten Members zugreift.      &lt;br /&gt;Das ganze ist mir eher unsympathisch und verkompliziert das ganze nur. Ausserdem entstehen Schwierigkeiten beim Mocking. Trotzdem war dies bis jetzt die Lösung meiner Wahl.      &lt;br /&gt;&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/PrivateMethodenmitUnitTeststesten_11972/TestReference_2.png" rel="lightbox"&gt;&lt;img title="TestReference" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="TestReference" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/PrivateMethodenmitUnitTeststesten_11972/TestReference_thumb.png" width="207" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Private Members gar nicht testen. Da private Methoden in der Regel irgendwo mal aufgerufen werden, kann man diese über Tests von öffentlichen Methoden abhandeln. Mittels CodeCoverage lässt sich überwachen, dass die Methoden auch wirklich getestet werden. Nur wiederspricht das natürlich klar den Gesetzen von UnitTests. &lt;/li&gt;    &lt;li&gt;Natürlich kann man sich auch etwas eigenes bauen, um mittels Reflection an die Methoden zu kommen.      &lt;br /&gt;Neben dem Aufwand birgt das natürlich auch Fehlerpotential – und Fehler in Tests sind eher doof :-) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Alles also irgendwie ok – aber halt doch nicht so. Heute bin ich aber über zwei Klassen gestossen, mit denen man das Problem doch recht einfach lösen kann: &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privateobject(VS.80).aspx"&gt;PrivateObject&lt;/a&gt; und &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privatetype(VS.80).aspx"&gt;PrivateType&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Und so siehts aus:&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name = &lt;span style="color: #006080"&gt;"Dani"&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; expected = &lt;span style="color: #006080"&gt;"Hello Dani"&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; MyClass mc = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MyClass();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; PrivateObject po = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PrivateObject(mc);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; actual = po.Invoke(&lt;span style="color: #006080"&gt;"SayHello"&lt;/span&gt;, name).ToString();&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Und für statische Methoden nimmt man einfach PrivateType:&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; PrivateType pt = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PrivateType(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(MyClass));&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; actual = pt.InvokeStatic(&lt;span style="color: #006080"&gt;"SayBye"&lt;/span&gt;, name).ToString();&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/217.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/217.aspx</wfw:comment>
        <slash:comments>4</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/217.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/217.aspx</trackback:ping>
    </entry>
    <entry>
        <title>nettigkeiten.ch goes Mobile!</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2008/07/25/nettigkeiten.ch-goes-mobile.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2008/07/25/nettigkeiten.ch-goes-mobile.aspx</id>
        <published>2008-07-25T00:22:42Z</published>
        <updated>2008-07-25T00:22:42Z</updated>
        <content type="html">&lt;p&gt;Dank der &lt;a href="http://feeds.beetagg.com"&gt;MobileFeeds&lt;/a&gt;-Applikation meines früheren Arbeitgebers &lt;a href="http://www.connvision.com"&gt;Connvision&lt;/a&gt; kann mein Blog nun auch komfortabel auf einem Mobile-Phone gelesen werden (mit entsprechend angepasster Darstellung).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://feeds.beetagg.com"&gt;&lt;img alt="mobilefeeds" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/nettigkeiten.chgoesMobile_4DE/mobilefeeds_3.gif" width="240" height="68" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Als Leckerli erhält man bei MobileFeeds auch gleich einen &lt;a href="http://blog.nettigkeiten.ch/archive/2006/06/02/beetagg.aspx"&gt;BeeTagg&lt;/a&gt; der auf den Mobile-Feed linkt. Die Software die man benötigt, um den BeeTagg zu lesen kriegt man &lt;a href="http://get.beetagg.com"&gt;hier&lt;/a&gt; oder auch über Wap-Push (weitere Infos: &lt;a href="http://www.beetagg.com"&gt;beetagg.com&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Ist der Reader erst installiert, kann man den untenstehenden BeeTagg lesen und wird auf den MobileFeed geleitet.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/nettigkeiten.chgoesMobile_4DE/beetagg.nettigkeiten_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="beetagg.nettigkeiten" src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/nettigkeiten.chgoesMobile_4DE/beetagg.nettigkeiten_thumb.png" width="240" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Hier noch eine kleine Demo wie kinderleicht das mit dem BeeTagg scannen so funktioniert:&lt;/p&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:eefb529a-d235-466d-83e4-33bba0a733d9" class="wlWriterSmartContent"&gt;&lt;div id="7b874537-404b-416d-b771-238db6366123" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=JQ0k--XQzZY&amp;amp;hl=en&amp;amp;fs=1" target="_new"&gt;&lt;img src="http://blog.nettigkeiten.ch/images/blog_nettigkeiten_ch/WindowsLiveWriter/nettigkeiten.chgoesMobile_4DE/videoc98e00e2cf39.jpg" galleryimg="no" onload="var downlevelDiv = document.getElementById('7b874537-404b-416d-b771-238db6366123'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/JQ0k--XQzZY&amp;amp;hl=en&amp;amp;fs=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;param name=\&amp;quot;wmode\&amp;quot; value=\&amp;quot;transparent\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/JQ0k--XQzZY&amp;amp;hl=en&amp;amp;fs=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; wmode=\&amp;quot;transparent\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/216.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/216.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/216.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/216.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Restaurant-Tip: Focacceria, St. Gallen (CH)</title>
        <link rel="alternate" type="text/html" href="http://blog.nettigkeiten.ch/archive/2008/07/22/restaurant-tip-focacceria-st.-gallen-ch.aspx" />
        <id>http://blog.nettigkeiten.ch/archive/2008/07/22/restaurant-tip-focacceria-st.-gallen-ch.aspx</id>
        <published>2008-07-22T21:22:20Z</published>
        <updated>2008-07-22T21:22:20Z</updated>
        <content type="html">&lt;link href="file:///C:\Users\dani\AppData\Local\Temp\msohtmlclip1\01\clip_filelist.xml" rel="File-List" /&gt;
&lt;link href="file:///C:\Users\dani\AppData\Local\Temp\msohtmlclip1\01\clip_themedata.thmx" rel="themeData" /&gt;
&lt;link href="file:///C:\Users\dani\AppData\Local\Temp\msohtmlclip1\01\clip_colorschememapping.xml" rel="colorSchemeMapping" /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:WordDocument&gt;
&lt;w:View&gt;Normal&lt;/w:View&gt;
&lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
&lt;w:TrackMoves /&gt;
&lt;w:TrackFormatting /&gt;
&lt;w:HyphenationZone&gt;21&lt;/w:HyphenationZone&gt;
&lt;w:PunctuationKerning /&gt;
&lt;w:ValidateAgainstSchemas /&gt;
&lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
&lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
&lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
&lt;w:DoNotPromoteQF /&gt;
&lt;w:LidThemeOther&gt;DE-CH&lt;/w:LidThemeOther&gt;
&lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
&lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
&lt;w:Compatibility&gt;
&lt;w:BreakWrappedTables /&gt;
&lt;w:SnapToGridInCell /&gt;
&lt;w:WrapTextWithPunct /&gt;
&lt;w:UseAsianBreakRules /&gt;
&lt;w:DontGrowAutofit /&gt;
&lt;w:SplitPgBreakAndParaMark /&gt;
&lt;w:DontVertAlignCellWithSp /&gt;
&lt;w:DontBreakConstrainedForcedTables /&gt;
&lt;w:DontVertAlignInTxbx /&gt;
&lt;w:Word11KerningPairs /&gt;
&lt;w:CachedColBalance /&gt;
&lt;/w:Compatibility&gt;
&lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
&lt;m:mathPr&gt;
&lt;m:mathFont m:val="Cambria Math" /&gt;
&lt;m:brkBin m:val="before" /&gt;
&lt;m:brkBinSub m:val="&amp;#45;-" /&gt;
&lt;m:smallFrac m:val="off" /&gt;
&lt;m:dispDef /&gt;
&lt;m:lMargin m:val="0" /&gt;
&lt;m:rMargin m:val="0" /&gt;
&lt;m:defJc m:val="centerGroup" /&gt;
&lt;m:wrapIndent m:val="1440" /&gt;
&lt;m:intLim m:val="subSup" /&gt;
&lt;m:naryLim m:val="undOvr" /&gt;
&lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
&lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267"&gt;
&lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal" /&gt;
&lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /&gt;
&lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 1" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 2" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 3" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 4" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 5" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 6" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 7" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 8" /&gt;
&lt;w:LsdException Locked="false" Priority="39" Name="toc 9" /&gt;
&lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /&gt;
&lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title" /&gt;
&lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /&gt;
&lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /&gt;
&lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong" /&gt;
&lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /&gt;
&lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid" /&gt;
&lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /&gt;
&lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /&gt;
&lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /&gt;
&lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /&gt;
&lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote" /&gt;
&lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /&gt;
&lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /&gt;
&lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /&gt;
&lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /&gt;
&lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /&gt;
&lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /&gt;
&lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title" /&gt;
&lt;w:LsdException Locked="false" Priority="37" Name="Bibliography" /&gt;
&lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /&gt;
&lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style type="text/css"&gt;&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0cm;
	margin-right:0cm;
	margin-bottom:10.0pt;
	margin-left:0cm;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:70.85pt 70.85pt 2.0cm 70.85pt;
	mso-header-margin:35.4pt;
	mso-footer-margin:35.4pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;&lt;/style&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0cm;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"Times New Roman";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;p class="MsoNormal"&gt;Ein kleines Novum hier im Blog. Ab und an will ich in Zukunft auf, meiner Meinung nach, besonders erwähnenswerte Restaurants hinweisen. Ich verstehe dies auch als kleine Belohnung für die jeweilige Crew, welche sich abgemüht hat, meiner Begleitung und mir einen schönen Abend zu ermöglichen. Schliesslich gibt es ja leider genug andere Beispiele.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Wer die &lt;a href="http://www.focacceria.ch"&gt;Focacceria&lt;/a&gt; betritt, wird von einer warmen, etwas rustikalen und trotzdem modern angehauchten Atmosphäre empfangen. Im Erdgeschoss ist quasi der Imbiss-Bereich – wobei dies einen etwas negativen Touch hat, der hier wahrlich nicht angebracht ist.&lt;br /&gt;
Im hinteren Bereich erwartet einen dann eine Theke voller mediteraner Köstlichkeiten, welche einem direkt an einen italienischen Feinkosthändler erinnert. Da reihen sich feinste Antipasti neben selbstgemachten Pasten (z.B. Oliven) ein. Die Stars der Theke sind aber die x verschiedenen Käsesorten sowie de grosse Auswahl an verschiedenen Leckereien für den Fleischesser. Hier darf man nun also sein eigenes Focaccia zusammenstellen. Es gibt drei verschiedene Grössen, wobei zumindest ich für das Grösste schon einen rechten Hunger brauche. Dann kann man sich eine Fleisch- oder Käsesorte auswählen, zwei Antipasti sowie eine Paste. Salat (z.B. Ruccola) gibt’s gratis. Das Fleisch wird frisch angeschnitten und mit den anderen Zutaten in das erwärmte Focaccia gepackt. Nun noch ein prickelnd frisches &lt;a href="http://www.gazosa.info"&gt;Gazosa&lt;/a&gt; dazu, und die Ferien-Stimmung ist perfekt.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="201" width="300" src="/images/blog_nettigkeiten_ch/DSC_0030.jpg" alt="" /&gt;  &lt;/p&gt;
&lt;p class="MsoNormal"&gt;(Bild focacceria.ch)&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Wer sich die schmale Treppe nach oben getraut, findet dort ein etwas eleganter aufgemachtes kleines Restaurant. Der obere Stock ist bedient. Man kann dort, neben den Focaccias auch von einer sehr kleinen aber feinen Karte aussuchen. Die Karte wird täglich geändert und offeriert einem gluschtige Tagliatelle, Suppen und Salate. Nach dem Essen sollte man sich unbedingt auf einen Dolci-Vorschlag der Bedienung einlassen, da gibt’s wirkliche Leckereien darunter.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Alles in allem ein wirklich gelungenes Lokal welches die totale Italianità versprüht. Die Preise sind zwar nicht ganz ohne, aber dafür erhält man auch wirklich qualitativ hervorragende Lebensmittel sehr gut zubereitet.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;img height="448" width="300" src="/images/blog_nettigkeiten_ch/DSC_0091.jpg" alt="" /&gt;&lt;img height="448" width="300" src="/images/blog_nettigkeiten_ch/DSC_0011.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;(Bilder focacceria.ch)&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Die Focacceria befindet sich an der Metzgergasse 22, 9000 St. Gallen.&lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt; &lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;br /&gt;
&lt;/p&gt;&lt;img src="http://blog.nettigkeiten.ch/aggbug/211.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.nettigkeiten.ch/comments/211.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.nettigkeiten.ch/comments/commentRss/211.aspx</wfw:commentRss>
        <trackback:ping>http://blog.nettigkeiten.ch/services/trackbacks/211.aspx</trackback:ping>
    </entry>
</feed>