<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Eleutian SpeakENG Development Blog</title>
    <link>http://blog.eleutian.com/</link>
    <description />
    <language>en-us</language>
    <copyright>Eleutian Technology</copyright>
    <lastBuildDate>Mon, 27 Oct 2008 01:12:55 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>aaron@eleutian.com</managingEditor>
    <webMaster>aaron@eleutian.com</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/EleutianSpeakengDevelopmentBlog" /><feedburner:info uri="eleutianspeakengdevelopmentblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><media:copyright>Eleutian Technology</media:copyright><geo:lat>47.63287</geo:lat><geo:long>-122.322536</geo:long><item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=f418a230-f873-408c-ad4a-f24492c0da20</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,f418a230-f873-408c-ad4a-f24492c0da20.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,f418a230-f873-408c-ad4a-f24492c0da20.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f418a230-f873-408c-ad4a-f24492c0da20</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Rapid UI Mockups with Balsamiq</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,f418a230-f873-408c-ad4a-f24492c0da20.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/0CE4fHlMvR0/RapidUIMockupsWithBalsamiq.aspx</link>
      <pubDate>Mon, 27 Oct 2008 01:12:55 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="166" alt="myImage (1)" src="http://blog.eleutian.com/content/binary/WindowsLiveWriter/RapidUIMockupswithBalsamiq_10007/myImage%20(1)_3.png" width="231" align="right" border="0"&gt;&lt;/img&gt;I&#xD;
recently came across &lt;a href="http://balsamiq.com/"&gt;Balsamiq&lt;/a&gt;, a very well done&#xD;
application for quickly mocking up UI prototypes. With simple drag and drops you can&#xD;
quickly create some pretty slick prototypes. The prototypes have a sketch like look&#xD;
which allows the viewer to use more of their imagination, something I think is a subtle,&#xD;
yet powerful advantage.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px; border-right-width: 0px" height="158" alt="mockups_fpa" src="http://blog.eleutian.com/content/binary/WindowsLiveWriter/RapidUIMockupswithBalsamiq_10007/mockups_fpa_3.jpg" width="204" align="left" border="0"&gt;&lt;/img&gt;It's&#xD;
been a while since I've been so impressed with an app right out of the box... especially&#xD;
a Flash app. Just about everything works as I'd expect, right down to common keyboard&#xD;
shortcuts. It's got good organization in it's "ribbon" and so far it's had just about&#xD;
every type of thing I need. It looks like it has JIRA and Confluence support, though&#xD;
that's a bit on the pricey side. The Desktop version is reasonably priced though,&#xD;
and the web version seems to be free to use if you can put up with a nag every 5 minutes.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Nothing beats a whiteboard if you're all in the same office, but I'd say this is a&#xD;
close second. Certainly better than Visio :)&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=f418a230-f873-408c-ad4a-f24492c0da20"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=0CE4fHlMvR0:0gEhk0RQKow:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=0CE4fHlMvR0:0gEhk0RQKow:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=0CE4fHlMvR0:0gEhk0RQKow:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=0CE4fHlMvR0:0gEhk0RQKow:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=0CE4fHlMvR0:0gEhk0RQKow:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=0CE4fHlMvR0:0gEhk0RQKow:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/0CE4fHlMvR0" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,f418a230-f873-408c-ad4a-f24492c0da20.aspx</comments>
      <category>random</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/10/27/RapidUIMockupsWithBalsamiq.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=25fb3904-3f89-4e28-9296-2b5eb127ecf5</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,25fb3904-3f89-4e28-9296-2b5eb127ecf5.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,25fb3904-3f89-4e28-9296-2b5eb127ecf5.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=25fb3904-3f89-4e28-9296-2b5eb127ecf5</wfw:commentRss>
      
      <title>Machine has moved</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,25fb3904-3f89-4e28-9296-2b5eb127ecf5.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/_n7KXl74C-A/MachineHasMoved.aspx</link>
      <pubDate>Wed, 22 Oct 2008 19:57:32 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Assembla was annoying us for a variety of reasons so we &lt;a href="http://github.com/machine/machine/tree/master"&gt;moved&#xD;
Machine to github&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;git clone git://github.com/machine/machine.git&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The astute may notice a few other repositories in the machine account... Jacob's been&#xD;
busy. We'll announce those projects in due time...&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=25fb3904-3f89-4e28-9296-2b5eb127ecf5"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=_n7KXl74C-A:u86WvXTtMAQ:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=_n7KXl74C-A:u86WvXTtMAQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=_n7KXl74C-A:u86WvXTtMAQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=_n7KXl74C-A:u86WvXTtMAQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=_n7KXl74C-A:u86WvXTtMAQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=_n7KXl74C-A:u86WvXTtMAQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/_n7KXl74C-A" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,25fb3904-3f89-4e28-9296-2b5eb127ecf5.aspx</comments>
      <category>machine</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/10/22/MachineHasMoved.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=23994350-beff-46f3-ba72-c072e0ea0417</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,23994350-beff-46f3-ba72-c072e0ea0417.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,23994350-beff-46f3-ba72-c072e0ea0417.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=23994350-beff-46f3-ba72-c072e0ea0417</wfw:commentRss>
      
      <title>Getting ReSharper and VS to play nice with MSpec</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,23994350-beff-46f3-ba72-c072e0ea0417.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/YvmZiHHUDps/GettingReSharperAndVSToPlayNiceWithMSpec.aspx</link>
      <pubDate>Sun, 19 Oct 2008 22:18:25 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;h2&gt;Does ReSharper want to make your specs look like this?&#xD;
&lt;/h2&gt;&#xD;
        &lt;img height="384" alt="Superfluous privates, indentation and warnings" src="http://content.screencast.com/users/ajensen/folders/Jing/media/5626ca97-5e0c-43d8-9db1-c1f7bac75fb9/2008-10-19_1449.png" width="613" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;h2&gt;But you want your specs to look like this?&#xD;
&lt;/h2&gt;&#xD;
        &lt;img height="386" alt="clean text with less noise" src="http://content.screencast.com/users/ajensen/folders/Jing/media/56b442ae-5b4d-4577-9807-762412ae5fbc/2008-10-19_1503.png" width="556" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;h2&gt;Just follow these easy steps:&#xD;
&lt;/h2&gt;&#xD;
        &lt;ol style="font-size: 1.6em"&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;p&gt;&#xD;
Go to Resharper&amp;gt;Options&#xD;
&lt;/p&gt;&#xD;
            &lt;img height="270" src="http://content.screencast.com/users/ajensen/folders/Jing/media/6812b390-e28c-4ff5-b47e-c4a803a44f94/2008-10-19_1454.png" width="226" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;p&gt;&#xD;
Go to Languages&amp;gt;C#&amp;gt;Formatting Style&amp;gt;Other&#xD;
&lt;/p&gt;&#xD;
            &lt;img height="490" src="http://content.screencast.com/users/ajensen/folders/Jing/media/689e080c-83e2-479b-88fd-00b1578d5695/2008-10-19_1455.png" width="190" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;p&gt;&#xD;
Uncheck Modifiers&amp;gt;Use explicit private modifier&#xD;
&lt;/p&gt;&#xD;
            &lt;img height="101" src="http://content.screencast.com/users/ajensen/folders/Jing/media/d1209891-e09b-4312-a545-f00a1cef1149/2008-10-19_1456.png" width="444" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;p&gt;&#xD;
Uncheck Other&amp;gt;Indent anonymous method body and hit OK&#xD;
&lt;/p&gt;&#xD;
            &lt;img height="158" src="http://content.screencast.com/users/ajensen/folders/Jing/media/a652911f-6e7c-4ee1-ae8b-7f63f605dbde/2008-10-19_1458.png" width="390" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;p&gt;&#xD;
Go to your project properties&amp;gt;Build and suppress warning 169&#xD;
&lt;/p&gt;&#xD;
            &lt;img height="363" src="http://content.screencast.com/users/ajensen/folders/Jing/media/74e14bde-982d-456d-9512-f45c29015661/2008-10-19_1511.png" width="493" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;p&gt;&#xD;
Enjoy!&#xD;
&lt;/p&gt;&#xD;
          &lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=23994350-beff-46f3-ba72-c072e0ea0417"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=YvmZiHHUDps:LIG-Mo8uwKU:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=YvmZiHHUDps:LIG-Mo8uwKU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=YvmZiHHUDps:LIG-Mo8uwKU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=YvmZiHHUDps:LIG-Mo8uwKU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=YvmZiHHUDps:LIG-Mo8uwKU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=YvmZiHHUDps:LIG-Mo8uwKU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/YvmZiHHUDps" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,23994350-beff-46f3-ba72-c072e0ea0417.aspx</comments>
      <category>bdd</category>
      <category>mspec</category>
      <category>resharper</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/10/19/GettingReSharperAndVSToPlayNiceWithMSpec.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=3d64e14f-379a-4bf1-b167-6d6eb8ae0f33</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,3d64e14f-379a-4bf1-b167-6d6eb8ae0f33.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,3d64e14f-379a-4bf1-b167-6d6eb8ae0f33.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3d64e14f-379a-4bf1-b167-6d6eb8ae0f33</wfw:commentRss>
      
      <title>BDD &amp;ndash; Consider your audience</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,3d64e14f-379a-4bf1-b167-6d6eb8ae0f33.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/Eae8Mmidhmo/BDDNdashConsiderYourAudience.aspx</link>
      <pubDate>Sun, 19 Oct 2008 17:24:03 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Unlike vanilla TDD, the artifacts produced by BDD can and should be read by more than&#xD;
just developers. Most of us who practice TDD name our tests more or less like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;MessageBoardControllerTests.Index_WithTenMessages_ReturnsFiveMostRecentFromRepository()&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Shifting into Context/Specification style testing, one may be tempted to write specs&#xD;
like this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;MessageBoardController, when invoking index action when there are ten messages, &#xD;
  should return five most recent messages from the repository&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
The problem with this spec is subtle but important. You often want these specs to&#xD;
be readable and understandable by a normal person, someone in your business that can&#xD;
provide you feedback on your specs. Using words like "invoking", "index",&#xD;
"action" and "repository" are clear indicators that your audience&#xD;
is another developer. You should use the time writing specs to speak in the language&#xD;
of the business and to clarify your ubiquitous language. Here's how I'd rewrite this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;Message Board, when viewed&#xD;
  should show only the five most recent messages&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Again, the difference is subtle, but notice how I could show this to anyone in the&#xD;
company and they would understand exactly what is happening.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
There are times for developer speak in specs I believe. If you are specing an API&#xD;
to be consumed by other developers I think it's ok to use words like "throw"&#xD;
and "return" because that is what the developers care about when integrating&#xD;
with an API.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Most of the time however, especially when writing the more UI/System Behavior level&#xD;
specs, you should consider who your audience is and try to speak like them. The code&#xD;
itself will provide the detail a developer needs to understand it.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As an aside, this is one of the many reasons I prefer the Context/Specification style&#xD;
to Given/When/Then style of BDD. Because people already don't speak in Given/When/Then&#xD;
prose in real life, it makes it even more difficult to write your specs for the intended&#xD;
audience. It also leads you to use magic numbers and other magic state in your prose&#xD;
rather than formalizing business concepts and improving your ubiquitous language.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=3d64e14f-379a-4bf1-b167-6d6eb8ae0f33"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=Eae8Mmidhmo:xu9jHvl1mFg:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=Eae8Mmidhmo:xu9jHvl1mFg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=Eae8Mmidhmo:xu9jHvl1mFg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=Eae8Mmidhmo:xu9jHvl1mFg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=Eae8Mmidhmo:xu9jHvl1mFg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=Eae8Mmidhmo:xu9jHvl1mFg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/Eae8Mmidhmo" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,3d64e14f-379a-4bf1-b167-6d6eb8ae0f33.aspx</comments>
      <category>bdd</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/10/19/BDDNdashConsiderYourAudience.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=2abf494c-72e0-4417-87ac-161040a7ce40</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,2abf494c-72e0-4417-87ac-161040a7ce40.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,2abf494c-72e0-4417-87ac-161040a7ce40.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2abf494c-72e0-4417-87ac-161040a7ce40</wfw:commentRss>
      
      <title>Udi Dahan&amp;rsquo;s SOA Bootcamp</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,2abf494c-72e0-4417-87ac-161040a7ce40.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/b_O1VTkxy88/UdiDahanrsquosSOABootcamp.aspx</link>
      <pubDate>Sun, 19 Oct 2008 15:52:18 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Jacob and I just got back from Austin, TX where we were fortunate enough to attend&#xD;
the week long, lengthily titled &lt;a href="http://www.headspringsystems.com/soa/"&gt;Advanced&#xD;
Distributed Systems Design using SOA &amp;amp; DDD with Udi Dahan, The Software Simplist&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Awesome. Just awesome. We’d been meaning to delve into messaging at Eleutian after&#xD;
multiple discussions with and blog posts from &lt;a href="http://codebetter.com/blogs/gregyoung/"&gt;Greg&#xD;
Young&lt;/a&gt; and &lt;a href="http://www.udidahan.com/"&gt;Udi Dahan&lt;/a&gt; in the past. We weren’t&#xD;
entirely sure where to start, how to start, what tools to use, how to use them, etc.&#xD;
Being able to sit in a room with Udi for an entire week while he described exactly&#xD;
how, why and what he does to tackle a massive enterprise system was invaluable to&#xD;
say the least. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
We now have a much better direction and, more importantly, have the confidence we&#xD;
need to start introducing these powerful concepts into production at Eleutian.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
If Udi’s ever in your area giving this course and you’ve got a company that cares&#xD;
about their scalability, reliability and maintainability enough to see the value in&#xD;
such an offering, I’d strongly advise giving it a go.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=2abf494c-72e0-4417-87ac-161040a7ce40"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=b_O1VTkxy88:nhfvWJGed-A:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=b_O1VTkxy88:nhfvWJGed-A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=b_O1VTkxy88:nhfvWJGed-A:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=b_O1VTkxy88:nhfvWJGed-A:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=b_O1VTkxy88:nhfvWJGed-A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=b_O1VTkxy88:nhfvWJGed-A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/b_O1VTkxy88" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,2abf494c-72e0-4417-87ac-161040a7ce40.aspx</comments>
      <category>soa</category>
      <category>training</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/10/19/UdiDahanrsquosSOABootcamp.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=1ae1cf90-fcc9-452d-ac1a-218de4d3fe1d</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,1ae1cf90-fcc9-452d-ac1a-218de4d3fe1d.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,1ae1cf90-fcc9-452d-ac1a-218de4d3fe1d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1ae1cf90-fcc9-452d-ac1a-218de4d3fe1d</wfw:commentRss>
      
      <title>Want to do cool things with ASP.NET MVC?</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,1ae1cf90-fcc9-452d-ac1a-218de4d3fe1d.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/6CcMSYVGfqk/WantToDoCoolThingsWithASPNETMVC.aspx</link>
      <pubDate>Sun, 19 Oct 2008 15:41:01 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.codeville.net/"&gt;Steve Sanderson&lt;/a&gt; is apparently writing &lt;a href="http://apress.com/community/mvc"&gt;two&#xD;
Apress books&lt;/a&gt; on &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt;. While doing&#xD;
so, he’s been digging deep into the framework and inventing/discovering some pretty&#xD;
amazing things. My favorites thus far are:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/"&gt;Partial&#xD;
Requests in ASP.NET MVC&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.codeville.net/2008/10/15/partial-output-caching-in-aspnet-mvc/"&gt;Partial&#xD;
Output Caching in ASP.NET MVC&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I’m yet to use it seriously, but I’m pretty sure this is a big part of what I’ve been&#xD;
looking for when it comes to components in MVC. Definitely going to keep an eye on&#xD;
his &lt;a href="http://blog.codeville.net/2008/10/15/partial-output-caching-in-aspnet-mvc/"&gt;blog&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=1ae1cf90-fcc9-452d-ac1a-218de4d3fe1d"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=6CcMSYVGfqk:yOFZL6N3NxY:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=6CcMSYVGfqk:yOFZL6N3NxY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=6CcMSYVGfqk:yOFZL6N3NxY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=6CcMSYVGfqk:yOFZL6N3NxY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=6CcMSYVGfqk:yOFZL6N3NxY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=6CcMSYVGfqk:yOFZL6N3NxY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/6CcMSYVGfqk" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,1ae1cf90-fcc9-452d-ac1a-218de4d3fe1d.aspx</comments>
      <category>asp.net mvc</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/10/19/WantToDoCoolThingsWithASPNETMVC.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=ff788dca-fce2-4ad7-856d-c1a7745a2517</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,ff788dca-fce2-4ad7-856d-c1a7745a2517.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,ff788dca-fce2-4ad7-856d-c1a7745a2517.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ff788dca-fce2-4ad7-856d-c1a7745a2517</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>MSpec v0.2</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,ff788dca-fce2-4ad7-856d-c1a7745a2517.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/u_XPx_NT41A/MSpecV02.aspx</link>
      <pubDate>Tue, 02 Sep 2008 21:49:51 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
It's been a while, but we've gotten several new things into Machine.Specifications&#xD;
(MSpec). I'm excited to finally release them for everyone to start playing with. You&#xD;
can grab the bits &lt;a href="http://www.assembla.com/spaces/machine/documents/aNW0n0Etir3yXNab7jnrAJ/download/mspec-0.2.zip"&gt;here&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Let's talk about what's new though. Here's an example of a new context/spec:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;  [Concern("Console runner")]&#xD;
  public class when_specifying_a_missing_assembly_on_the_command_line&#xD;
  {&#xD;
    Establish context = ()=&amp;gt;&#xD;
    {&#xD;
      console = new FakeConsole();&#xD;
      program = new Program(console);&#xD;
    };&#xD;
&#xD;
    Because of = ()=&amp;gt;&#xD;
      exitCode = program.Run(new string[] {missingAssemblyName});&#xD;
&#xD;
    It should_output_an_error_message_with_the_name_of_the_missing_assembly = ()=&amp;gt;&#xD;
      console.Lines.ShouldContain(string.Format(Resources.MissingAssemblyError, &#xD;
      missingAssemblyName));&#xD;
&#xD;
    It should_return_the_Error_exit_code = ()=&amp;gt;&#xD;
      exitCode.ShouldEqual(ExitCode.Error);&#xD;
&#xD;
    const string missingAssemblyName = "Some.Missing.Assembly.dll";&#xD;
    public static ExitCode exitCode;&#xD;
    public static Program program;&#xD;
    public static FakeConsole console;&#xD;
  }&#xD;
&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;There have been a few semantic changes&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
The Description attribute has been removed. There is now an optional Concern attribute&#xD;
that allows you to specify a type and/or a string that the context/spec is concerned&#xD;
with. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;Context before_each&lt;/strong&gt; is now &lt;strong&gt;Establish context&lt;/strong&gt;. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;Context before_all&lt;/strong&gt; is now &lt;strong&gt;Establish context_once&lt;/strong&gt;. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;Context after_each &lt;/strong&gt;is now &lt;strong&gt;Cleanup after_each&lt;/strong&gt;. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;Context after_all&lt;/strong&gt; is now &lt;strong&gt;Cleanup after_each&lt;/strong&gt;. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;When {...}&lt;/strong&gt; is now &lt;strong&gt;Because of&lt;/strong&gt;. This is closer to&#xD;
SpecUnit.NET's verbage, and doesn't force you to specify the "when" twice. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;There is now a console runner&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
We don't quite have all the options we want yet, but the basics of the runner are&#xD;
working. Here's the help from the runner:&#xD;
&lt;/p&gt;&#xD;
        &lt;img height="163" src="http://content.screencast.com/users/ajensen/folders/Jing/media/0b6d7837-d45c-4124-93f7-38bc37a7fa7b/2008-09-02_1429.png" width="588" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;p&gt;&#xD;
We also stole Bellware's SpecUnit.NET reporting stuff and ported it over. You can&#xD;
now generate a report on your specs with the --html &#xD;
&lt;file.html&gt;&#xD;
switch. Here's an example run:&#xD;
&lt;/file.html&gt;&lt;/p&gt;&#xD;
        &lt;img height="355" src="http://content.screencast.com/users/ajensen/folders/Jing/media/aef95516-cf4e-4df0-b428-a890624abcfe/2008-09-02_1436.png" width="588" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.eleutian.com/download/mspec-0.2run.html"&gt;This is the report it&#xD;
generates.&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Want to try it out?&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
Grab the drop &lt;a href="http://www.assembla.com/spaces/machine/documents/aNW0n0Etir3yXNab7jnrAJ/download/mspec-0.2.zip"&gt;here&lt;/a&gt;. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Extract it somewhere. Put it somewhere semi-permanent because the &lt;a href="http://testdriven.net/"&gt;TestDriven.NET&lt;/a&gt; runner&#xD;
will need a static location for the MSpec TDNet Runner. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
If you want TestDriven.NET support, run &lt;strong&gt;InstallTDNetRunner.bat&lt;/strong&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Check out the example in &lt;strong&gt;Machine.Specifications.Example&lt;/strong&gt;. Note that&#xD;
you can run with TD.NET. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Create a project of your own. Just add &lt;strong&gt;Machine.Specifications.dll&lt;/strong&gt; and&#xD;
get started. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Send me feedback! Leave comments, email me, &lt;a href="http://twitter.com/aaronjensen"&gt;tweet&#xD;
me&lt;/a&gt;, whatever. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
Also, this is part of &lt;a href="http://www.assembla.com/wiki/show/machine"&gt;Machine&lt;/a&gt;,&#xD;
so feel free to take a &lt;a href="http://svn2.assembla.com/svn/machine/trunk/"&gt;look&#xD;
at the code&lt;/a&gt; and/or submit patches. There's also a &lt;a href="http://www.gallio.org/"&gt;Gallio&lt;/a&gt; adapter&#xD;
in there, but I didn't include it in the release as it's not quite polished enough&#xD;
yet. If you're interested in it, talk to me. Special thanks to &lt;a href="http://twitter.com/sbellware"&gt;Scott&#xD;
Bellware&lt;/a&gt;, &lt;a href="http://blog.bits-in-motion.com/"&gt;Jeff Brown&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/nunitaddin/default.aspx"&gt;Jamie&#xD;
Cansdale&lt;/a&gt; for their help and support. Also, extra special thanks to Eleutian's&#xD;
newest dev, Jeff Olson for much of the recent work that has gone into MSpec!&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=ff788dca-fce2-4ad7-856d-c1a7745a2517"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=u_XPx_NT41A:bEzs2QYg5YU:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=u_XPx_NT41A:bEzs2QYg5YU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=u_XPx_NT41A:bEzs2QYg5YU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=u_XPx_NT41A:bEzs2QYg5YU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=u_XPx_NT41A:bEzs2QYg5YU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=u_XPx_NT41A:bEzs2QYg5YU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/u_XPx_NT41A" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,ff788dca-fce2-4ad7-856d-c1a7745a2517.aspx</comments>
      <category>bdd</category>
      <category>frameworks</category>
    <media:content url="http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~5/52UhaSsGoMg/mspec-0.2.zip" fileSize="67901" type="application/zip" /><feedburner:origLink>http://blog.eleutian.com/2008/09/02/MSpecV02.aspx</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~5/52UhaSsGoMg/mspec-0.2.zip" length="67901" type="application/zip" /><feedburner:origEnclosureLink>http://www.assembla.com/spaces/machine/documents/aNW0n0Etir3yXNab7jnrAJ/download/mspec-0.2.zip</feedburner:origEnclosureLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=2bacd3f9-be27-4029-87e9-1f8111a1145b</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,2bacd3f9-be27-4029-87e9-1f8111a1145b.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,2bacd3f9-be27-4029-87e9-1f8111a1145b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2bacd3f9-be27-4029-87e9-1f8111a1145b</wfw:commentRss>
      
      <title>Don't take RY (Repeat Yourself) in specs too far</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,2bacd3f9-be27-4029-87e9-1f8111a1145b.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/2wDvG7RReO8/DontTakeRYRepeatYourselfInSpecsTooFar.aspx</link>
      <pubDate>Wed, 02 Jul 2008 03:04:07 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Mikel Lindsaar recently &lt;a href="http://www.lindsaar.net/2008/6/24/tip-24-being-clever-in-specs-is-for-dummies"&gt;posted&#xD;
a tip&lt;/a&gt; encouraging rSpec users to not use before :each, and set up the context&#xD;
in every "it" specification. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I'm afraid I disagree. By pushing context setup into your specifications, you're&#xD;
allowing your contexts to become artificial and anemic and your specifications to&#xD;
become fat and more than just specifications. &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
Ultimately, this means that your reports will read poorly and it will be easy to introduce&#xD;
specifications in a context that do not match the others.&lt;br&gt;&lt;br&gt;&#xD;
Mikel arrives at the following specs at the end of his post: &#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code" class="ruby"&gt;describe "when not logged in" do&#xD;
  it "should redirect if we are not logged in" do&#xD;
    get :index&#xD;
    response.should redirect_to login_path&#xD;
  end&#xD;
end&#xD;
&#xD;
describe "when logged in" do&#xD;
  def given_a_logged_in_user&#xD;
    session[:logged_in] = true&#xD;
    session[:user_id] = 99&#xD;
  end&#xD;
&#xD;
  it "should let be a success" do&#xD;
    given_a_logged_in_user&#xD;
    get :index&#xD;
    response.should be_success&#xD;
  end&#xD;
&#xD;
  it "should render the index template" do&#xD;
    given_a_logged_in_user&#xD;
    get :index&#xD;
    response.should render_template('people/index')&#xD;
  end&#xD;
end&lt;/pre&gt;&#xD;
"when logged in" is not what I would consider a valid description of Mikel's&#xD;
context in these specs. I would call it something along the lines of "when visiting&#xD;
the index page while logged in". *That* is the context you are specifying against.&#xD;
Compare:&lt;br&gt;&lt;br&gt;&#xD;
when logged in, it should render the index template&lt;br&gt;&lt;br&gt;&#xD;
vs.&lt;br&gt;&lt;br&gt;&#xD;
when visiting the index page while logged in, it should render the index template&lt;br&gt;&lt;br&gt;&#xD;
The first is clearly missing something. Unless rendering the index template is a direct&#xD;
result of just *being* logged in, the spec is flawed.&lt;br&gt;&lt;br&gt;&#xD;
With that in mind, as soon as you describe your context, there's no reason to&#xD;
not pull that context setup into a single before method. It forces you to use that&#xD;
context in every specification contained within your describe. It also makes your&#xD;
tests easier to read. You establish your context, and then you make one line specifications&#xD;
against that context. &#xD;
&lt;br&gt;&lt;br&gt;&#xD;
I do agree that DRY should not be taken too far in tests. Base classes, helper methods,&#xD;
all that sort of thing can quickly obfuscate them, but do not forsake the context&#xD;
setup. &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=2bacd3f9-be27-4029-87e9-1f8111a1145b"&gt;&lt;/img&gt;&lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=2wDvG7RReO8:DZUnAwMJCME:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=2wDvG7RReO8:DZUnAwMJCME:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=2wDvG7RReO8:DZUnAwMJCME:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=2wDvG7RReO8:DZUnAwMJCME:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=2wDvG7RReO8:DZUnAwMJCME:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=2wDvG7RReO8:DZUnAwMJCME:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/2wDvG7RReO8" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,2bacd3f9-be27-4029-87e9-1f8111a1145b.aspx</comments>
      <category>bdd</category>
      <category>rspec</category>
      <category>dry</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/07/02/DontTakeRYRepeatYourselfInSpecsTooFar.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=b9a23177-84da-4932-894c-877f59e8ca0f</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,b9a23177-84da-4932-894c-877f59e8ca0f.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,b9a23177-84da-4932-894c-877f59e8ca0f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b9a23177-84da-4932-894c-877f59e8ca0f</wfw:commentRss>
      
      <title>Rhino.Mocks Performance Issue Fixed</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,b9a23177-84da-4932-894c-877f59e8ca0f.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/XhvDvLd44qQ/RhinoMocksPerformanceIssueFixed.aspx</link>
      <pubDate>Fri, 09 May 2008 05:56:48 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Just wanted to quickly note that I tracked down the performance issue in Rhino.Mocks&#xD;
and &lt;a href="http://rhino-tools.svn.sourceforge.net/viewvc/rhino-tools?view=rev&amp;amp;revision=1382"&gt;patched&#xD;
it&lt;/a&gt;. I also updated the &lt;a href="http://blog.eleutian.com/2008/05/08/MockFrameworkBenchmarks.aspx"&gt;original&#xD;
post&lt;/a&gt; with the new numbers. Enjoy!&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=b9a23177-84da-4932-894c-877f59e8ca0f"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=XhvDvLd44qQ:hFvcsnejpos:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=XhvDvLd44qQ:hFvcsnejpos:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=XhvDvLd44qQ:hFvcsnejpos:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=XhvDvLd44qQ:hFvcsnejpos:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=XhvDvLd44qQ:hFvcsnejpos:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=XhvDvLd44qQ:hFvcsnejpos:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/XhvDvLd44qQ" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,b9a23177-84da-4932-894c-877f59e8ca0f.aspx</comments>
      <category>development</category>
      <category>frameworks</category>
      <category>mocking</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/05/09/RhinoMocksPerformanceIssueFixed.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=96b7cc98-7d7d-4aae-8734-42347fcf8464</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,96b7cc98-7d7d-4aae-8734-42347fcf8464.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,96b7cc98-7d7d-4aae-8734-42347fcf8464.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=96b7cc98-7d7d-4aae-8734-42347fcf8464</wfw:commentRss>
      
      <title>Mock Framework Benchmarks</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,96b7cc98-7d7d-4aae-8734-42347fcf8464.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/4zppJHHQCEY/MockFrameworkBenchmarks.aspx</link>
      <pubDate>Thu, 08 May 2008 15:52:30 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;strong&gt;UPDATE: I tracked down the issue&#xD;
and committed a patch to Rhino.Mocks. Rhino.Mocks is now much more competetive performance&#xD;
wise, our CI build time nearly halved, and about 4 minutes out of 7 of our test time&#xD;
has disappeared. New numbers below.&lt;/strong&gt;&#xD;
        &lt;p&gt;&#xD;
I've complained before that &lt;a href="http://blog.eleutian.com/2007/12/15/MockingIsSlow.aspx"&gt;Mocking&#xD;
is Slow&lt;/a&gt; but I never really dove further into it. Today I decided to actually compare&#xD;
Rhino.Mocks to other mock frameworks on a pure performance basis to see if it was&#xD;
a global problem. I timed 2000 unit tests across 100 classes with 20 tests each. The&#xD;
results were a bit surprising:&#xD;
&lt;/p&gt;&#xD;
        &lt;table&gt;&#xD;
          &lt;tbody&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;th&gt;&#xD;
Framework&lt;/th&gt;&#xD;
              &lt;th&gt;&#xD;
                &lt;a href="http://testdriven.net/"&gt;TD.NET&lt;/a&gt; Time&lt;/th&gt;&#xD;
              &lt;th&gt;&#xD;
nunit-console Time&lt;/th&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td&gt;&#xD;
                &lt;a href="http://www.ayende.com/projects/rhino-mocks.aspx"&gt;Rhino.Mocks&lt;/a&gt; old trunk&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
57.36s&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
28.82s&lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td&gt;&#xD;
                &lt;a href="http://www.ayende.com/projects/rhino-mocks.aspx"&gt;Rhino.Mocks&lt;/a&gt; new trunk&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
22.94s&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
7.59s&lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td&gt;&#xD;
                &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt; trunk&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
18.30s&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
5.91s&lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td&gt;&#xD;
                &lt;a href="http://www.typemock.com/"&gt;TypeMock&lt;/a&gt; 4.2.3 Reflective Mocks&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
15.36s&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
9.35s&lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
            &lt;tr&gt;&#xD;
              &lt;td&gt;&#xD;
                &lt;a href="http://www.typemock.com/"&gt;TypeMock&lt;/a&gt; 4.2.3 Natural Mocks&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
16.92s&lt;/td&gt;&#xD;
              &lt;td&gt;&#xD;
9.56s&lt;/td&gt;&#xD;
            &lt;/tr&gt;&#xD;
          &lt;/tbody&gt;&#xD;
        &lt;/table&gt;&#xD;
        &lt;p&gt;&#xD;
That's right, according to these tests, &lt;a href="http://www.ayende.com/projects/rhino-mocks.aspx"&gt;Rhino.Mocks&lt;/a&gt; is&#xD;
at least 3 times slower than the other frameworks when under heavy load in TD.NET&#xD;
and five times slower in the console according to these tests. It's also interesting&#xD;
to note that &lt;a href="http://www.typemock.com/"&gt;TypeMock&lt;/a&gt; is faster than &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt; in&#xD;
TD.NET, but slower in the console runner.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
While running the Rhino.Mocks tests it is very clear that there is a degrading performance&#xD;
issue. All the other frameworks executed tests with a near constant speed per test,&#xD;
but Rhino.Mocks slowed down noticeably about half way through.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Please feel free to try it yourself, grab the project &lt;a href="http://blog.eleutian.com/download/BenchMock.zip"&gt;here&lt;/a&gt;.&#xD;
You should be able to just run the 4 strategy .bat files (run-rhino, run-moq, run-tmock-reflective,&#xD;
run-tmock-natural). Let me know if you find anything interesting.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=96b7cc98-7d7d-4aae-8734-42347fcf8464"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=4zppJHHQCEY:s1g8JUbAjAw:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=4zppJHHQCEY:s1g8JUbAjAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=4zppJHHQCEY:s1g8JUbAjAw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=4zppJHHQCEY:s1g8JUbAjAw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=4zppJHHQCEY:s1g8JUbAjAw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=4zppJHHQCEY:s1g8JUbAjAw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/4zppJHHQCEY" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,96b7cc98-7d7d-4aae-8734-42347fcf8464.aspx</comments>
      <category>development</category>
      <category>frameworks</category>
      <category>mocking</category>
    <media:content url="http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~5/NXCjGh2ioUE/BenchMock.zip" fileSize="512573" type="application/x-zip-compressed" /><feedburner:origLink>http://blog.eleutian.com/2008/05/08/MockFrameworkBenchmarks.aspx</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~5/NXCjGh2ioUE/BenchMock.zip" length="512573" type="application/x-zip-compressed" /><feedburner:origEnclosureLink>http://blog.eleutian.com/download/BenchMock.zip</feedburner:origEnclosureLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=2e4f933f-e00c-445e-ab64-17bf9a64d96f</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,2e4f933f-e00c-445e-ab64-17bf9a64d96f.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,2e4f933f-e00c-445e-ab64-17bf9a64d96f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2e4f933f-e00c-445e-ab64-17bf9a64d96f</wfw:commentRss>
      <slash:comments>8</slash:comments>
      
      <title>Introducing Machine.Specifications (or MSpec for short)</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,2e4f933f-e00c-445e-ab64-17bf9a64d96f.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/nXDvRnqgcZI/IntroducingMachineSpecificationsOrMSpecForShort.aspx</link>
      <pubDate>Thu, 08 May 2008 07:11:27 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
As some of you who follow &lt;a href="http://twitter.com/aaronjensen"&gt;me on twitter&lt;/a&gt; know,&#xD;
I've been working on Yet Another Context/Specification Framework as an experiment.&#xD;
Yeah, I know we already have &lt;a href="http://nspec.tigris.org/"&gt;NSpec&lt;/a&gt; and &lt;a href="http://nbehave.org/"&gt;NBehave&lt;/a&gt;,&#xD;
and they're great and all, but MSpec takes things on from a slightly different angle,&#xD;
and it's just an experiment (for now). Here's a sample Description:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre name="code"&gt;[Description]&#xD;
public class Transferring_between_from_account_and_to_account&#xD;
{&#xD;
  static Account fromAccount;&#xD;
  static Account toAccount;&#xD;
&#xD;
  Context before_each =()=&amp;gt;&#xD;
  {&#xD;
    fromAccount = new Account {Balance = 1m};&#xD;
    toAccount = new Account {Balance = 1m};&#xD;
  };&#xD;
  &#xD;
  When the_transfer_is_made =()=&amp;gt;&#xD;
  {&#xD;
    fromAccount.Transfer(1m, toAccount);&#xD;
  };&#xD;
   &#xD;
  It should_debit_the_from_account_by_the_amount_transferred =()=&amp;gt;&#xD;
  {&#xD;
    fromAccount.Balance.ShouldEqual(0m);&#xD;
  };&#xD;
&#xD;
  It should_credit_the_to_account_by_the_amount_transferred =()=&amp;gt;&#xD;
  {&#xD;
    toAccount.Balance.ShouldEqual(2m);&#xD;
  };&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
And a TestDriven.NET run:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre&gt;------ Test started: Assembly: Machine.Specifications.Example.dll ------&#xD;
&#xD;
Transferring between from account and to account&#xD;
  When the transfer is made&#xD;
    * It should debit the from account by the amount transferred&#xD;
    * It should credit the to account by the amount transferred&#xD;
&#xD;
&#xD;
2 passed, 0 failed, 0 skipped, took 0.79 seconds.&#xD;
&lt;/pre&gt;&#xD;
        &lt;br&gt;&#xD;
        &lt;h3&gt;Err, What?&#xD;
&lt;/h3&gt;&#xD;
        &lt;p&gt;&#xD;
Different eh? The idea was heavily inspired by &lt;a href="http://twitter.com/sbellware"&gt;Scott&#xD;
Bellware&lt;/a&gt;'s SpecUnit.Net framework he showed at the ALT.NET conference. It also&#xD;
took heavy cues from &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; and my insanity. I realize&#xD;
that the the code doesn't look much like C# code and I'm OK with that. Many have and&#xD;
will ask why I don't just use Boo or RSpec w/ IronRuby eventually or even one of the&#xD;
existing Context/Spec/BDD frameworks. Those are good questions, but my main motivations&#xD;
are tooling and syntax. I enjoy the tooling I get in C# and I personally like the&#xD;
syntax in this library considering the limitations imposed by C#.&#xD;
&lt;/p&gt;&#xD;
        &lt;h3&gt;How's it work?&#xD;
&lt;/h3&gt;&#xD;
        &lt;p&gt;&#xD;
The simplest way to describe it is to compare it to a normal *Unit style testing framework: &#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Description = TestContext &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Context before_each = SetUp &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Context before_all = SetUpFixture &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Context after_each = TearDown &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Context after_all = TearDownFixture &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
When = Also SetUp, but happens after Context before_each &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
It = Test &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
Rather than methods and attributes, MSpec uses named delegates and anonymous functions.&#xD;
The only reason for this is readability. You'll also notice that the fields used in&#xD;
the context are static. This is necessary so that the anonymous functions in the field&#xD;
initializers can access them. Probably the first thing you noticed is the =()=&amp;gt;&#xD;
construct. I won't mention the names that this was given on twitter, but I think it's&#xD;
an acceptable thing to have to deal with in exchange for the cleanliness of the rest&#xD;
of the syntax.&#xD;
&lt;/p&gt;&#xD;
        &lt;h3&gt;Ok, you're crazy, but how do I try it?&#xD;
&lt;/h3&gt;&#xD;
        &lt;p&gt;&#xD;
First, this is a very rough cut. Everything is subject to change as we experiment&#xD;
with the language. That said, here's how you play with it:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
Grab the drop &lt;a href="http://blog.eleutian.com/download/mspec-0.1.zip"&gt;here&lt;/a&gt;. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Extract it somewhere. Put it somewhere semi-permanent because the &lt;a href="http://testdriven.net/"&gt;TestDriven.NET&lt;/a&gt; runner&#xD;
will need a static location for the MSpec TDNet Runner. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
If you want TestDriven.NET support, run &lt;strong&gt;InstallTDNetRunner.bat&lt;/strong&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Check out the example in &lt;strong&gt;Machine.Specifications.Example&lt;/strong&gt;. Note that&#xD;
you can run with TD.NET. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Create a project of your own. Just add &lt;strong&gt;Machine.Specifications.dll&lt;/strong&gt; and&#xD;
get started. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Send me feedback! Leave comments, email me, &lt;a href="http://twitter.com/aaronjensen"&gt;tweet&#xD;
me&lt;/a&gt;, whatever. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
Also, this is part of &lt;a href="http://www.assembla.com/wiki/show/machine"&gt;Machine&lt;/a&gt;,&#xD;
so feel free to take a &lt;a href="http://svn2.assembla.com/svn/machine/trunk/"&gt;look&#xD;
at the code&lt;/a&gt; and/or submit patches. There's also a &lt;a href="http://www.gallio.org/"&gt;Gallio&lt;/a&gt; adapter&#xD;
in there, but I didn't include it in the release as it's not quite polished enough&#xD;
yet. If you're interested in it, talk to me. Special thanks to &lt;a href="http://twitter.com/sbellware"&gt;Scott&#xD;
Bellware&lt;/a&gt;, &lt;a href="http://blog.bits-in-motion.com/"&gt;Jeff Brown&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/nunitaddin/default.aspx"&gt;Jamie&#xD;
Cansdale&lt;/a&gt; for their help and support.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=2e4f933f-e00c-445e-ab64-17bf9a64d96f"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=nXDvRnqgcZI:3xZKKco-Plg:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=nXDvRnqgcZI:3xZKKco-Plg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=nXDvRnqgcZI:3xZKKco-Plg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=nXDvRnqgcZI:3xZKKco-Plg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=nXDvRnqgcZI:3xZKKco-Plg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=nXDvRnqgcZI:3xZKKco-Plg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/nXDvRnqgcZI" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,2e4f933f-e00c-445e-ab64-17bf9a64d96f.aspx</comments>
      <category>development</category>
      <category>frameworks</category>
      <category>open source</category>
      <category>test driven development</category>
    <media:content url="http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~5/3ey-v4pfzN8/mspec-0.1.zip" fileSize="40294" type="application/x-zip-compressed" /><feedburner:origLink>http://blog.eleutian.com/2008/05/08/IntroducingMachineSpecificationsOrMSpecForShort.aspx</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~5/3ey-v4pfzN8/mspec-0.1.zip" length="40294" type="application/x-zip-compressed" /><feedburner:origEnclosureLink>http://blog.eleutian.com/download/mspec-0.1.zip</feedburner:origEnclosureLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=3446a5e2-83a1-4cf9-9a2c-9b65d08be8be</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,3446a5e2-83a1-4cf9-9a2c-9b65d08be8be.aspx</pingback:target>
      <dc:creator>Jacob</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,3446a5e2-83a1-4cf9-9a2c-9b65d08be8be.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3446a5e2-83a1-4cf9-9a2c-9b65d08be8be</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>A First Look At Machine.Migrations</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,3446a5e2-83a1-4cf9-9a2c-9b65d08be8be.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/V1-vLCWP1t4/AFirstLookAtMachineMigrations.aspx</link>
      <pubDate>Fri, 25 Apr 2008 20:37:26 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;h4&gt;&#xD;
          &lt;strong&gt;Introduction&lt;/strong&gt;&#xD;
        &lt;/h4&gt;&#xD;
        &lt;p&gt;&#xD;
We used ActiveRecord migrations at Eleutian for a number of months. Everything was&#xD;
right with the world and we had no major complaints until we started running into&#xD;
a problem with our more complex migration scenarios. Usually, we see two kinds of&#xD;
migrations:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;Schema&lt;/strong&gt; - Add/remove/rename columns, manipulate tables, and general&#xD;
schema related changes. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;Data&lt;/strong&gt; - Refactoring data into new schemas and major data reorganization&#xD;
or population. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
Schema migrations are handled great by most of the migration frameworks out there.&#xD;
One problem we were running into was it's typically easier to write the data migrations&#xD;
in C# directly using our entities and services. As a result we had two different ways&#xD;
of migrating and this made our frequent publishes problematic. We decided to consolidate&#xD;
the two operations.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
On the outside there's nothing really new in Machine.Migrations that you haven't seen&#xD;
elsewhere. Most of the changes are internal. Migrations are numbered right now, although&#xD;
we've talked of moving to time-stamping them a la the newer ruby ActiveRecord. What&#xD;
Machine.Migrations does allow you to do is heavily tweak your migrations to fit your&#xD;
project. In our project we have a custom MsBuild task that extends the default implementation&#xD;
to provide access to our DaoFactory and other goodies. If this is something that interests&#xD;
you, then read on. If you're happy with your current migration scenario then you probably&#xD;
don't have a huge need for Machine.Migrations.&#xD;
&lt;/p&gt;&#xD;
        &lt;h4&gt;&#xD;
          &lt;strong&gt;A Simple Migration&lt;/strong&gt;&#xD;
        &lt;/h4&gt;&#xD;
        &lt;p&gt;&#xD;
I'll start with the actual migrations. Here is an example that creates a table:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;using System;&#xD;
using System.Collections.Generic;&#xD;
using Machine.Migrations;&#xD;
&#xD;
public class CreateUserTable : SimpleMigration&#xD;
{&#xD;
  public override void Up()&#xD;
  {&#xD;
    Schema.AddTable("users", new Column[] {&#xD;
      new Column("Id", typeof(Int32), 4, true, false),&#xD;
      new Column("Name", typeof (string), 64, false, false),&#xD;
      new Column("Email", typeof (string), 64, false, false),&#xD;
      new Column("Login", typeof (string), 64, false, false),&#xD;
      new Column("Password", typeof (string), 64, false, false),&#xD;
    });&#xD;
  }&#xD;
&#xD;
  public override void Down()&#xD;
  {&#xD;
    Schema.DropTable("users");&#xD;
  }&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Machine.Migrations does enforce a file naming/class naming restriction so the file&#xD;
for this migration would be named &lt;font face="Courier New"&gt;001_create_user_table.cs&lt;/font&gt;.&#xD;
We inherit from &lt;font face="Courier New"&gt;SimpleMigration&lt;/font&gt;, which is built-in&#xD;
and provides access to Schema manipulations and raw Database queries through those&#xD;
properties respectively. We have a solution and project for our migrations so that&#xD;
we can get IntelliSense while writing them. This can be helpful if you forget the&#xD;
syntax.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
When you run Machine.Migrations it will only compile the migrations that it needs&#xD;
to apply. This is very handy if you are doing high-level migrations including your&#xD;
entities because then you don't have to maintain them after they've been applied to&#xD;
your live database. &lt;strong&gt;But&lt;/strong&gt;, this does mean you won't be able to migrate&#xD;
from the beginning to the end because migrations will become outdated. This has been&#xD;
a minor problem for us because we snapshot our live database and run that in development.&#xD;
I do think a better long term solution is required though, in order to make creating&#xD;
a brand new database easier. Perhaps flagging migrations as data migrations and not&#xD;
running them if they don't compile? I am not sure.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
There is also a Boo migration factory that you can use if you don't want to write&#xD;
your migrations in C#. Internally, the infrastructure is there if you want to add&#xD;
other languages as well.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Another interesting thing I should note is that each migration is run inside its own&#xD;
transaction, so if you mess up it'll just rollback. This is &lt;strong&gt;very&lt;/strong&gt; nice&#xD;
under SQL Server because schema changes are rolled back as well.&#xD;
&lt;/p&gt;&#xD;
        &lt;h4&gt;&#xD;
          &lt;strong&gt;How Do I Start Using It?&lt;/strong&gt;&#xD;
        &lt;/h4&gt;&#xD;
        &lt;p&gt;&#xD;
If you just want to use Machine.Migrations out of the box (a good first step) it's&#xD;
fairly straightforward:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
Copy Machine.Migrations and its dependencies into your project. Be sure to include&#xD;
the Machine.Migrations.targets file which has the default MsBuild task and target. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
You can then drop the following XML into your MsBuild file (check all your paths!): &#xD;
&lt;br&gt;&lt;pre class="xml" name="code"&gt;&amp;lt;Import Project="Libraries\Machine\Machine.Migrations.targets" /&amp;gt;&#xD;
&#xD;
&amp;lt;PropertyGroup&amp;gt;&#xD;
  &amp;lt;MigrationConnectionString&amp;gt;Data Source=127.0.0.1;Initial Catalog=MyDb;Integrated Security=SSPI&amp;lt;/MigrationConnectionString&amp;gt;&#xD;
&amp;lt;/PropertyGroup&amp;gt;&#xD;
&#xD;
&amp;lt;Target Name="Migrate" DependsOnTargets="MigrateDatabase"&amp;gt;&#xD;
&amp;lt;/Target&amp;gt;&lt;/pre&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
All that's happening here is we're importing the targets file, defining a connection&#xD;
string to use when migrating, and then making a target that depends on the target&#xD;
we imported. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
By default it will look for your migrations in a subdirectory named Migrations. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Then it's just a matter of running &lt;font face="Courier New" size="2"&gt;MsBuild YourProject.proj&#xD;
/t:Migrate&lt;/font&gt; where YourProject.proj is your MsBuild file. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
One thing you may notice is that sometimes your migrations will fail to compile because&#xD;
of a missing dependency. In order to ensure your own or third party assemblies are&#xD;
referenced you add them to the MigrationReferences ItemGroup, like so:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="xml" name="code"&gt;&amp;lt;ItemGroup&amp;gt;&#xD;
  &amp;lt;MigrationReferences Include="System.Xml.dll"&amp;gt;&#xD;
    &amp;lt;InProject&amp;gt;false&amp;lt;/InProject&amp;gt;&#xD;
  &amp;lt;/MigrationReferences&amp;gt;&#xD;
&amp;lt;/ItemGroup&amp;gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
When Machine.Migrations compiles it will include those assemblies in the references&#xD;
list.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;What Next?&lt;/strong&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I'm going to hold off on explaining how to extend the default migration scenario until&#xD;
later because this post is already pretty long. For anyone feeling ambitious it basically&#xD;
amounts to extending SimpleMigration in your own code and inheriting from that. (Be&#xD;
sure to include your assembly in MigrationReferences). We go a step further and wrap&#xD;
the MsBuild task as well, which may or may not be necessary for you.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I can't stress enough that going down this road isn't for everybody. There is an argument&#xD;
for keeping migrations simple and making those complex data migrations something else's&#xD;
concern. For now, this is what we're doing and it has worked nicely. I'm sure there&#xD;
will be lots of questions as well, please feel free to comment and offer up suggestions.&#xD;
As far as I know we're the only people using this code, so I'm sure there are quirks.&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=3446a5e2-83a1-4cf9-9a2c-9b65d08be8be"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=V1-vLCWP1t4:Nj6VPGnFIgU:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=V1-vLCWP1t4:Nj6VPGnFIgU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=V1-vLCWP1t4:Nj6VPGnFIgU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=V1-vLCWP1t4:Nj6VPGnFIgU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=V1-vLCWP1t4:Nj6VPGnFIgU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=V1-vLCWP1t4:Nj6VPGnFIgU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/V1-vLCWP1t4" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,3446a5e2-83a1-4cf9-9a2c-9b65d08be8be.aspx</comments>
    <feedburner:origLink>http://blog.eleutian.com/2008/04/25/AFirstLookAtMachineMigrations.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=5349636c-dfca-447e-aa82-fd6f5eecb9e7</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,5349636c-dfca-447e-aa82-fd6f5eecb9e7.aspx</pingback:target>
      <dc:creator>Jacob</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,5349636c-dfca-447e-aa82-fd6f5eecb9e7.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5349636c-dfca-447e-aa82-fd6f5eecb9e7</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>Good Tools and ReSharper 4 EAP Thoughts</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,5349636c-dfca-447e-aa82-fd6f5eecb9e7.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/qiLzIyN6-oc/GoodToolsAndReSharper4EAPThoughts.aspx</link>
      <pubDate>Wed, 16 Apr 2008 23:42:40 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
One idea I've been thinking about lately is that good tools get out of your way. I&#xD;
started thinking about this after reading &lt;a href="http://www.kenrockwell.com/tech/notcamera.htm"&gt;an&#xD;
article&lt;/a&gt; about photography and fancy equipment. A few days later I was upgrading&#xD;
my &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt; to the latest EAP and&#xD;
started thinking about how the same principal applies to my tools in software development.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I've been a huge fan of ReSharper for a long time. It and ViEmu are an absolute necessity&#xD;
for me when doing any kind of work with C#. After we first installed it at work we&#xD;
would joke that it just knows what you want to do. When I use a new tool I usually&#xD;
don't see the value right away and to help others see the value faster I'm going to&#xD;
give a short list of the features I personally use constantly. Here is my list for&#xD;
ReSharper:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;&#xD;
              &lt;a href="http://www.jetbrains.com/resharper/documentation/help20/AdvEditing/errorHighlighting.html"&gt;Error&#xD;
Highlighting&lt;/a&gt;&#xD;
            &lt;/strong&gt;: Anything that saves me from a failed build saves me tons&#xD;
of time. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;&#xD;
              &lt;a href="http://www.jetbrains.com/resharper/documentation/help20/AdvEditing/quickFixes.html"&gt;Quick-Fix&lt;/a&gt; (Alt-Enter)&lt;/strong&gt;:&#xD;
Import Type and Initialize field from constructor(s) parameter. I use one of these&#xD;
every minute it seems. I also like that I can disable things. For example, I disable&#xD;
"Redundant this qualifier", that's how I roll. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;&#xD;
              &lt;a href="http://www.jetbrains.com/resharper/documentation/help20/AdvEditing/altinsert.html"&gt;Generate&lt;/a&gt; (Alt-Ins)&lt;/strong&gt;:&#xD;
I usually generate properties and constructors with field initializers. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;Refactor&lt;/strong&gt;: &lt;a href="http://www.jetbrains.com/resharper/documentation/help20/Refactoring/moveType.html"&gt;Move&#xD;
Type to File&lt;/a&gt;, &lt;a href="http://www.jetbrains.com/resharper/documentation/help20/Refactoring/renaming.html#renameClass"&gt;Rename&lt;/a&gt;&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;&#xD;
              &lt;a href="http://www.jetbrains.com/resharper/documentation/help20/AdvEditing/codeCompletionTypeName.html"&gt;Ctrl-Alt-Space&lt;/a&gt;&#xD;
            &lt;/strong&gt;:&#xD;
Complete Type Name from any namespace, imported or not. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
            &lt;strong&gt;&#xD;
            &lt;/strong&gt;&#xD;
            &lt;a href="http://www.jetbrains.com/resharper/documentation/help20/UsageSearch/findResultsWindow.html"&gt;Find&#xD;
Usages:&lt;/a&gt; I like that it keeps a history of past searches and that I can group things&#xD;
by project/namespace. It crosses usages out when I change things too, which is helpful. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://blog.excastle.com/2007/01/31/blog-event-the-31-days-of-resharper/"&gt;It&#xD;
can do a lot more than this&lt;/a&gt;. What's particularly important is that I never know&#xD;
I'm using another tool. I rarely see dialogs popup and break my flow, that sort of&#xD;
thing. It gets out of my way. I'm always looking at my code. That's important because&#xD;
it's what I'm &lt;strong&gt;doing&lt;/strong&gt;. Do your favorite tools get out of your way?&#xD;
While I have an audience I'm going to ask for a couple of things:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
I would love to be able to set my IntelliSense to &lt;strong&gt;default&lt;/strong&gt; to Ctrl-Alt-Space&#xD;
mode when completing a type name. I'm trying to avoid having to go into that mode&#xD;
manually. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
When generating code (properties, constructors, etc...) there's a second dialog now&#xD;
that lets you set properties on the generated members. I would like to disable this&#xD;
second dialog, I'll never use it. It's much faster for me to manually tweak the generated&#xD;
code using my Vim-Fu. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
Are either of these things possible already? Also, before you go, I think it's good&#xD;
to know which specific things people find particularly useful about their tools. If&#xD;
you have any features of any tool that you use &lt;strong&gt;several&lt;/strong&gt; times a day,&#xD;
I'd love to hear what they are. Maybe I'm missing out on something.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Also, I'll be in Seattle for ALT.NET so come up and shake my hand!&#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=5349636c-dfca-447e-aa82-fd6f5eecb9e7"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=qiLzIyN6-oc:Y3msQMYafpw:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=qiLzIyN6-oc:Y3msQMYafpw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=qiLzIyN6-oc:Y3msQMYafpw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=qiLzIyN6-oc:Y3msQMYafpw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=qiLzIyN6-oc:Y3msQMYafpw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=qiLzIyN6-oc:Y3msQMYafpw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/qiLzIyN6-oc" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,5349636c-dfca-447e-aa82-fd6f5eecb9e7.aspx</comments>
    <feedburner:origLink>http://blog.eleutian.com/2008/04/16/GoodToolsAndReSharper4EAPThoughts.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://blog.eleutian.com/Trackback.aspx?guid=40a71cf3-47c7-49ac-bb9c-ab9074adf0d1</trackback:ping>
      <pingback:server>http://blog.eleutian.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.eleutian.com/PermaLink,guid,40a71cf3-47c7-49ac-bb9c-ab9074adf0d1.aspx</pingback:target>
      <dc:creator>Aaron</dc:creator>
      <wfw:comment>http://blog.eleutian.com/CommentView,guid,40a71cf3-47c7-49ac-bb9c-ab9074adf0d1.aspx</wfw:comment>
      <wfw:commentRss>http://blog.eleutian.com/SyndicationService.asmx/GetEntryCommentsRss?guid=40a71cf3-47c7-49ac-bb9c-ab9074adf0d1</wfw:commentRss>
      <slash:comments>4</slash:comments>
      
      <title>Mocking Events</title>
      <guid isPermaLink="false">http://blog.eleutian.com/PermaLink,guid,40a71cf3-47c7-49ac-bb9c-ab9074adf0d1.aspx</guid>
      <link>http://feedproxy.google.com/~r/EleutianSpeakengDevelopmentBlog/~3/lhrn7ROnu7c/MockingEvents.aspx</link>
      <pubDate>Sun, 13 Apr 2008 08:30:10 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
Currently in Rhino.Mocks, making mocks fire events and ensuring that an event on your&#xD;
SUT was fired are both awkward and verbose at best. Here is an example of both things&#xD;
at once:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;[Test]&#xD;
public void ViewFiresBeginDrag_Always_FiresChangedEvent()&#xD;
{&#xD;
  IEventRaiser raiser;&#xD;
  bool eventFired = false;&#xD;
  using (Record)&#xD;
  {&#xD;
    The&amp;lt;ICardView&amp;gt;().BeginDrag += null;&#xD;
    raiser = LastCall.IgnoreArguments().GetEventRaiser();&#xD;
&#xD;
    Target.Changed += (x,y) =&amp;gt; eventFired = true;&#xD;
  }&#xD;
&#xD;
  using (Playback)&#xD;
  {&#xD;
    raiser.Raise(The&amp;lt;ICardView&amp;gt;(), EventArgs.Empty);&#xD;
    Assert.IsTrue(eventFired);&#xD;
  }&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Nice eh? First, is there a better way to do either of these things that I'm missing?&#xD;
Please tell me if so. Next, if not, what can we do to clean this up?&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Well, Ayende and I &lt;a href="http://www.ayende.com/Blog/archive/2007/06/09/Rhino-Mocks-Events-Twisting-the-Syntax.aspx"&gt;discussed&#xD;
this&lt;/a&gt; in the past and Ayende spiked it and &lt;a href="http://www.ayende.com/Blog/archive/2007/06/23/Natural-Event-Syntax-for-Rhino-Mocks.aspx"&gt;asked&#xD;
for feedback&lt;/a&gt;. The feedback was mixed and for one reason or another it never made&#xD;
it into Rhino.Mocks that I know of.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Well, today while I was working on &lt;a href="http://svn2.assembla.com/svn/machine/trunk/Machine.Testing/"&gt;Machine.Testing&lt;/a&gt; and&#xD;
another side project, I decided to give something else a shot. What I ended up with&#xD;
is this:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;[Test]&#xD;
public void ViewFiresBeginDrag_Always_FiresChangedEvent()&#xD;
{&#xD;
  using (Record)&#xD;
  {&#xD;
    PrimeEventFiringOn&amp;lt;ICardView&amp;gt;(x =&amp;gt; x.BeginDrag += null);&#xD;
    Target.Changed += NewEventFireExpectation&amp;lt;EventHandler&amp;gt;();&#xD;
  }&#xD;
&#xD;
  using (Playback)&#xD;
  {&#xD;
    FireEventOn&amp;lt;ICardView&amp;gt;(EventArgs.Empty);&#xD;
  }&#xD;
}&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
Better, but I still don't think it's perfect. Also, it probably requires some explanation,&#xD;
so let's pick it apart piece by piece:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;    PrimeEventFiringOn&amp;lt;ICardView&amp;gt;(x =&amp;gt; x.BeginDrag += null);&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
=&amp;gt; +=??? Ugly huh? I really wish we could just refer to an event somehow without&#xD;
having to do +=/-=. At least I'm &lt;a href="http://twitter.com/jbogard/statuses/788133552"&gt;not&#xD;
using vb though&lt;/a&gt;... Alas, we cannot access them easily so we're stuck hacking away&#xD;
like this. So this particular method will basically get the mock or stub ICardView.BeginDrag&#xD;
ready to be fired. This needs to be done during the record phase it seems. You can&#xD;
only prime one event at a time per mock, so if you need to do more than one you can&#xD;
revert to the normal Rhino.Mocks syntax.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;    Target.Changed += NewEventFireExpectation&amp;lt;EventHandler&amp;gt;();&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
This was a fun method. This method actually creates a new DynamicMethod in the signature&#xD;
required by the event and creates a new delegate. The method tracks whether or not&#xD;
it was fired, and at the end of the Playback phase in my fixture it will assert that&#xD;
all of the events were actually fired.&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;    FireEventOn&amp;lt;ICardView&amp;gt;(EventArgs.Empty);&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
This actually fires the event we set up in the Prime call. It can only be called after&#xD;
you've primed an event.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So, the whole thing is kind of "magic", but it's less code if you can accept the magic.&#xD;
I think we can make things even better though, but it'd require changes to Rhino.Mocks&#xD;
and it's time for bed so maybe Ayende can swing by the Eleutian office while in Seattle&#xD;
and we can work on it. Here's what I'm thinking:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;[Test]&#xD;
public void ViewFiresBeginDrag_Always_FiresChangedEvent()&#xD;
{&#xD;
  using (Record)&#xD;
  {&#xD;
    Target.Changed += Mocks.CreateEventHandler&amp;lt;EventHandler&amp;gt;();&#xD;
  }&#xD;
&#xD;
  using (Playback)&#xD;
  {&#xD;
    EventRaiser.Raise(() =&amp;gt; The&lt;icardview&gt;&#xD;
().BeginDrag += null, The&amp;lt;ICardView&amp;gt;(), EventArgs.Empty); } }&#xD;
&lt;/icardview&gt;&lt;/pre&gt;&#xD;
        &lt;p&gt;&#xD;
There's probably more you can do with the CreateEventHandler syntax like add more&#xD;
specific expectations, assert its not fired, assert that it's fired X times, etc.&#xD;
The EventRaiser syntax is ugly, but it doesn't involve strings or the fire from the&#xD;
right hand side like the syntax I mentioned at the beginning of the post.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can get the source &lt;a href="http://svn2.assembla.com/svn/machine/trunk/Machine.Testing/"&gt;here&lt;/a&gt;,&#xD;
but I warn you it's first draft and there are hacky bits.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Oh, and here's some example tests using the TestsFor fixture:&#xD;
&lt;/p&gt;&#xD;
        &lt;pre class="c-sharp" name="code"&gt;[TestFixture]&#xD;
public class CardPresenterTests : TestsFor&amp;lt;CardPresenter&amp;gt;&#xD;
{&#xD;
  private Card _card;&#xD;
&#xD;
  public override void SetupContainer()&#xD;
  {&#xD;
    Override&amp;lt;ICardView&amp;gt;(With.Stub);&#xD;
  }&#xD;
&#xD;
  public override void BeforeEachTest()&#xD;
  {&#xD;
    _card = new Card(0);&#xD;
  }&#xD;
&#xD;
  [Test]&#xD;
  public void OnBeginDrag_Always_SetsIsInFluxToTrue()&#xD;
  {&#xD;
    using (Record)&#xD;
    {&#xD;
      PrimeEventFiringOn&amp;lt;ICardView&amp;gt;(x =&amp;gt; x.BeginDrag += null);&#xD;
    }&#xD;
&#xD;
    using (Playback)&#xD;
    {&#xD;
      FireEventOn&lt;icardview&gt;&#xD;
(EventArgs.Empty); Assert.That(The&amp;lt;ICardView&amp;gt;().IsInFlux, Is.True); } } [Test]&#xD;
public void OnBeginDrag_Always_FiresChangedEvent() { using (Record) { PrimeEventFiringOn&amp;lt;ICardView&amp;gt;(x&#xD;
=&amp;gt; x.BeginDrag += null); Target.Changed += NewEventFireExpectation&amp;lt;EventHandler&amp;gt;();&#xD;
} using (Playback) { FireEventOn&amp;lt;ICardView&amp;gt;(EventArgs.Empty); } } }&#xD;
&lt;/icardview&gt;&lt;/pre&gt;&#xD;
        &lt;img width="0" height="0" src="http://blog.eleutian.com/aggbug.ashx?id=40a71cf3-47c7-49ac-bb9c-ab9074adf0d1"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=lhrn7ROnu7c:i9pGGamYAq0:PExsZR6WIA8"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=PExsZR6WIA8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=lhrn7ROnu7c:i9pGGamYAq0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=lhrn7ROnu7c:i9pGGamYAq0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=lhrn7ROnu7c:i9pGGamYAq0:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?a=lhrn7ROnu7c:i9pGGamYAq0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EleutianSpeakengDevelopmentBlog?i=lhrn7ROnu7c:i9pGGamYAq0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EleutianSpeakengDevelopmentBlog/~4/lhrn7ROnu7c" height="1" width="1"/&gt;</description>
      <comments>http://blog.eleutian.com/CommentView,guid,40a71cf3-47c7-49ac-bb9c-ab9074adf0d1.aspx</comments>
      <category>development</category>
      <category>frameworks</category>
      <category>mocking</category>
    <feedburner:origLink>http://blog.eleutian.com/2008/04/13/MockingEvents.aspx</feedburner:origLink></item>
  <media:rating>nonadult</media:rating></channel>
</rss>
