<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ISerializable - Roy Osherove's  Blog : Agile Related</title><link>http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx</link><description>Tags: Agile Related</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Art of unit Testing goes to print in April</title><link>http://weblogs.asp.net/rosherove/archive/2009/03/16/art-of-unit-testing-goes-to-print-in-april.aspx</link><pubDate>Mon, 16 Mar 2009 23:33:45 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6968598</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6968598</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2009/03/16/art-of-unit-testing-goes-to-print-in-april.aspx#comments</comments><description>&lt;p&gt;The &lt;a href="http://www.ArtOfUnitTesting.com"&gt;book of never ending production&lt;/a&gt; is now actually near the end. &lt;/p&gt;  &lt;p&gt;the projected print date of “Art Of Unit Testing” is now April 30 and I’m happy to see the &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1933988274/iserializable-20"&gt;Amazon page for the book&lt;/a&gt; already has one review of the &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=462_91"&gt;early access version&lt;/a&gt; (though he &lt;a href="http://www.amazon.com/Must-Have-Books-for-your-shelf/forum/Fx3HZHLJNJKXXLK/Tx23FXJ7W0JBTWI/1/ref=cm_cd_dp_tft_tp?_encoding=UTF8&amp;amp;asin=1933988274&amp;amp;store=books"&gt;totally destroys my spelling and book formatting abilities&lt;/a&gt;, he likes the content, so I’m happy)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=462_91"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/rosherove/image_5FC0326C.png" width="244" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6968598" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item><item><title>What Isolation\Mocking and unit testing framework are you using?</title><link>http://weblogs.asp.net/rosherove/archive/2009/03/09/what-isolation-mocking-and-unit-testing-framework-are-you-using.aspx</link><pubDate>Mon, 09 Mar 2009 20:11:06 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6951820</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6951820</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2009/03/09/what-isolation-mocking-and-unit-testing-framework-are-you-using.aspx#comments</comments><description>&lt;p&gt;It’s time to re-examine where things stand in our little niche.&lt;/p&gt;  &lt;p&gt;This should be interesting, if enough people answer – so &lt;strong&gt;please answer &lt;/strong&gt;(you need flash).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table border="0" cellspacing="5" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;embed allowScriptAccess="never" saveEmbedTags="true" src="http://www.polldaddy.com/poll.swf" FlashVars="p=1440417" quality="high" wmode="transparent" bgcolor="&amp;#035;ffffff" width="252" height="555" name="beta3" salign="tl" scale="autoscale" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt; &lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;embed allowScriptAccess="never" saveEmbedTags="true" src="http://www.polldaddy.com/poll.swf" FlashVars="p=1440454" quality="high" wmode="transparent" bgcolor="&amp;#035;ffffff" width="252" height="524" name="beta3" salign="tl" scale="autoscale" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;embed allowScriptAccess="never" saveEmbedTags="true" src="http://www.polldaddy.com/poll.swf" FlashVars="p=1440436" quality="high" wmode="transparent" bgcolor="&amp;#035;ffffff" width="252" height="431" name="beta3" salign="tl" scale="autoscale" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt; &lt;/td&gt;        &lt;td valign="top" width="200"&gt;&lt;embed allowScriptAccess="never" saveEmbedTags="true" src="http://www.polldaddy.com/poll.swf" FlashVars="p=1440458" quality="high" wmode="transparent" bgcolor="&amp;#035;ffffff" width="252" height="462" name="beta3" salign="tl" scale="autoscale" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6951820" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category></item><item><title>Unit Testing in VB.NET – with Typemock Isolator (with a free license offer)</title><link>http://weblogs.asp.net/rosherove/archive/2009/01/13/unit-testing-in-vb-net-with-typemock-isolator-with-a-free-license-offer.aspx</link><pubDate>Tue, 13 Jan 2009 18:24:18 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6834281</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6834281</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2009/01/13/unit-testing-in-vb-net-with-typemock-isolator-with-a-free-license-offer.aspx#comments</comments><description>&lt;p&gt;A move I’ve been pushing for a while now has finally come through today – Helping to bring unit testing into VB.NET. This is something I strongly believe in: VB has been kind of left behind with the range of latest alt.net related frameworks – mostly because they are C# specific. That means that some of them if not most, that use mambda expressions or anonymous delegates, are less approachable to the larger VB community (VB is missing some key functionality in that space, but even if it did have that functionality, I think the new API we are bringing is easier to grok).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.typemock.com/2009/01/get-free-isolator-licnese-for-helping.html"&gt;We're announcing today&lt;/a&gt; a new version of Typemock Isolator (5.2). One of the coolest features in the new version is the inclusion of a new &lt;a href="http://www.typemock.com/vbpage.php?utm_source=vbp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;VB .NET unit testing API&lt;/a&gt;. This 'VB friendly' API was designed and written in VB.NET, for VB.NET developers. It uses the strengths of the VB.NET language to allow easy and intuitive use of the isolation API, for easier unit tests on any piece of .NET code.    &lt;br /&gt;To launch this enhanced VB support we are offering you a &lt;strong&gt;FREE full Typemock Isolator 5.2 personal license&lt;/strong&gt; (worth $139 !!!).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How do I get a free license?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Post the text below on your blog (as is, with links) and &lt;a href="mailto:vb@typemock.com"&gt;tell us about it&lt;/a&gt; . If you are in the first 25 to mail us after posting, your license will be on its way!&lt;/p&gt;  &lt;p&gt;If you have a &lt;strong&gt;VB.NET dedicated blog&lt;/strong&gt;, you'll get a license automatically (even if more than 25 submit) during the first week of this announcement.&lt;/p&gt;  &lt;p&gt;A few simple requirements:   &lt;br /&gt;&lt;strong&gt;(1)&lt;/strong&gt; You must own a website, blog space or internet column, older than 2 months, or get permission from the owner of such a site.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;(2)&lt;/strong&gt; Your post must include the text below (including the links) between &lt;strong&gt;*Begin*&lt;/strong&gt; &lt;strong&gt;&lt;/strong&gt;and &lt;strong&gt;*End*&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;_&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;*Begin*&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.typemock.com/vbpage.php?utm_source=vbp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;Programming Visual Basic&lt;/a&gt; applications?&lt;/p&gt;  &lt;p&gt;Typemock have released a new version of their &lt;a href="http://www.typemock.com/?utm_source=hp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;unit testing&lt;/a&gt; tool, Typemock Isolator 5.2.    &lt;br /&gt;This version includes a new friendly &lt;a href="http://www.typemock.com/vbpage.php?utm_source=vbp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;VB.NET &lt;/a&gt;API which makes Isolator the best Isolation tool for &lt;a href="http://www.typemock.com/vbpage.php?utm_source=vbp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;unit testing A Visual Basic (VB) .NET application&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Isolator now allows unit testing in VB or C# for many ‘hard to test’ technologies such as &lt;a href="http://typemock.com/sharepointpage.php?utm_source=spp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;SharePoint&lt;/a&gt;, ASP.NET MVC, partial support for Silverlight, WPF, LINQ, WF, Entity Framework, &lt;a href="http://www.typemock.com/wcfpage.php?utm_source=wcfp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;WCF unit testing&lt;/a&gt; and more.&lt;/p&gt;  &lt;p&gt;Note that the first 25 bloggers who blog this text in their blog and tell us about it, will get a &lt;strong&gt;Free Full Isolator license&lt;/strong&gt; (worth $139). If you post this in a &lt;strong&gt;VB.NET dedicated blog&lt;/strong&gt;, you'll get a license automatically (even if more than 25 submit) during the first week of this announcement.&lt;/p&gt;  &lt;p&gt;Go ahead, click the following link for &lt;a href="http://blog.typemock.com/2009/01/get-free-isolator-licnese-for-helping.html?utm_source=vb_blog&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvbblog"&gt;more information &lt;/a&gt;on how to get your free license.&lt;/p&gt;  &lt;p&gt;_&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;*End*&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6834281" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category></item><item><title>Unit Testing decoupled from TDD as well== Adoption</title><link>http://weblogs.asp.net/rosherove/archive/2008/10/01/unit-testing-decoupled-from-tdd-as-well-adoption.aspx</link><pubDate>Wed, 01 Oct 2008 13:27:22 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6650125</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>19</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6650125</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/10/01/unit-testing-decoupled-from-tdd-as-well-adoption.aspx#comments</comments><description>&lt;p&gt;The discussion on the future of unit testing for the masses has shifted from the standard “if they are too stupid to learn it, we don’t want them” to “TDD without good design will make really bad tests”. and this is a good thing. it’s a good thing because it secretly implies that if you could write Good Unit Tests, regardless of design, then teaching design as a separate thing should not pose a problem.&lt;/p&gt;  &lt;p&gt;Discussion so far:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://weblogs.asp.net/rosherove/archive/2008/09/26/unit-testing-decoupled-from-design-adoption.aspx"&gt;Unit Testing Decoupled From Design == adoption&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://weblogs.asp.net/rosherove/archive/2008/09/20/goodbye-mocks-farewell-stubs.aspx"&gt;Goodbye mocks, Farewell stubs&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;But first, let’s make one thing clear: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;TDD is NOT Unit Testing.&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;My previous post was not “TDD decoupled from design==adoption”, it was “Unit testing decoupled from design == adoption&lt;/p&gt;  &lt;p&gt;TDD is (technically) about &lt;strong&gt;when&lt;/strong&gt; you write the unit test.&lt;/p&gt;  &lt;p&gt;You can still write crappy tests in TDD mode. With good design. Unit Tests deserve a good book about them without TDD in it because the current books about TDD suffer from lack of SRP.&lt;/p&gt;  &lt;p&gt;On the other hand you can still write good tests, without TDD. The design might make them a little longer, but if you learn to write unit tests well, this should not pose a problem.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Learn &lt;a href="http://www.infoq.com/news/2008/03/cockburn-testing-guts"&gt;Good Unit Testing&lt;/a&gt; regardless of TDD and Design&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;people can start learning unit testing before learning TDD. they learn the silly stuff (the kind udi looks down upon) in an hour, and then they get to the hard stuff : making the tests readable, maintainable and trust worthy.&amp;#160; these are &lt;strong&gt;separate&lt;/strong&gt; properties that can be learned to be done regardless of design, since test naming convention, refactoring and correctness can be learned in separate.&lt;/p&gt;  &lt;p&gt;The only reason it’s really hard to teach in separate today is because as those devs get to test real world code they have to start dealing with real world dependencies and that it the barrier that usually stops most people. having “intermediate” frameworks in place such as JMockit and Typemock Isolator can help in that regard, keeping people focused on the task at hand and deferring the need to learn other types of design for a time that is better. The idea is to let the developer &lt;em&gt;choose&lt;/em&gt; when to learn which technique:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Learn how to write good unit tests (&lt;a href="http://www.manning.com/osherove/"&gt;book&lt;/a&gt;)&lt;/li&gt;    &lt;li&gt;Learn Good Design technique (give me a link to a good starter book!)&lt;/li&gt;    &lt;li&gt;Learn Test Driven Development (&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0735619484/"&gt;book&lt;/a&gt;)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I want a developer to grok each one of those things to a very deep level, but today’s “market” wants them to learn it all in one go. Since each one is its own little art form, are you really surprised to learn that most of the mass population is not there yet?&lt;/p&gt;  &lt;p&gt;If people think that the only way to write good unit tests that are not worthless is by doing them TDD style with SOLID design, they are showing several things to me:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;they don’t get what “good” unit testing is&lt;/li&gt;    &lt;li&gt;They don’t “get” what value good tests have outside the context of TDD&lt;/li&gt;    &lt;li&gt;they guide a community who reads them down a path of “all or nothing”. which for most people begets “nothing”.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Field notes:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Udi &lt;a href="http://www.udidahan.com/2008/09/30/unit-testing-for-developers-and-managers/"&gt;writes&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“If logic is duplicated, if the code is tightly coupled, if there is no separation of concerns, the unit tests will be useless - even if they “test” the class in isolation.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;That is wrong in many levels. Let’s start with the fact that a unit test can have a specific value in testing a specific class in isolation, even if the bugs in that class are duplicated on other classes. If Udi does not agree on that, I don’t know what else to say about that. I &lt;strong&gt;wish&lt;/strong&gt;&amp;#160; that what he meant was that all these problems were repeating in the tests, since this is usually why people fail when they start out unit testing: they write crappy tests with bugs, code duplication and lack of isolation (this can all be learned). But he’s not.&amp;#160; It feels like a “purist” view that does not reflect the real world. It must be nice living in an echo chamber!&lt;/p&gt;  &lt;p&gt;Let’s see udi contradict himself in the same post:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Managers shouldn’t necessarily sacrifice their projects on this altar of learning. Organizations need to find ways for developers to safely practice these techniques as a part of developing their “human resources”. First of all, this needs to be communicated to everyone - that the organization understands the importance of these techniques, the desires of developers to adopt them, and the projects that need to be delivered.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;“…It’s a gradual process.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;That’s the problem Udi. It’s &lt;strong&gt;not&lt;/strong&gt; possible to do it gradually today, because people keep saying that you can’t do things in little chunks. you have to learn it all together. If we were to help developers learn what good unit testing means they could much more easily learn that stuff, and then learn the other stuff. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Casey &lt;a href="http://devlicio.us/blogs/casey/archive/2008/10/01/testing-is-not-technically-hard-it-is-hard-because-it-requires-clear-thought-and-understanding.aspx"&gt;writes&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“It is not a technical challenge to write a unit test, any half trained monkey could do it. A few attributes, a couple of classes, a few new() statements, and a few Assert statements. We don't need magic mocking frameworks, we don't need any mocking frameworks for 90% of our tests, we don't need application of 12 GoF principles before we can write a test, honestly.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Testing and writing automated tests is hard because it requires a strong understanding of the user stories that sit behind your code and project, because it requires you to think as a user and not as a developer, and because it requires you to be able to think of multiple conflicting axioms, test cases and class interactions, and how to cover the weaknesses of each individual test with other complementary tests.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Casey preached about what he sees as the “end game” for unit testing, TDD and Design. where everything is in one great ball of goodness. Or did he?&lt;/p&gt;  &lt;p&gt;Let’s separate these points into better chunks:&lt;/p&gt;  &lt;p&gt;Design related stuff:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;to think of multiple… class interactions &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Good Test related stuff:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Understanding of the user stories&lt;/li&gt;    &lt;li&gt;Think as a user not a developer&lt;/li&gt;    &lt;li&gt;think of multiple conflicting axioms (..?) test cases..&lt;/li&gt;    &lt;li&gt;how to cover the weaknesses of each individual test with other complementation tests.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;TDD related stuff&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;none&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So, what I gather from casey’s words is that you want your tests to be :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;testing the right thing&lt;/li&gt;    &lt;li&gt;be readable and show intent&lt;/li&gt;    &lt;li&gt;have good coverage&lt;/li&gt;    &lt;li&gt;test or be aware of class interactions (the design related stuff)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;except the last point which is where most of today’s mock frameworks force you to redesign, there is nothing here you can’t learn separated &lt;strong&gt;from &lt;/strong&gt;TDD and SOLID techniques. the interaction stuff is where those other isolation frameworks I mentioned come into place.&lt;/p&gt;  &lt;p&gt;We need to &lt;strong&gt;decouple Good Unit Testing&lt;/strong&gt; from TDD and SOLID. And it seems that not only “noobs”, as a stupid idiot commented thoughtfully on my last post, can benefit from learning this distinction.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6650125" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item><item><title>Kanban, anyone?</title><link>http://weblogs.asp.net/rosherove/archive/2008/08/27/kanban-anyone.aspx</link><pubDate>Wed, 27 Aug 2008 21:41:49 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6572481</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6572481</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/08/27/kanban-anyone.aspx#comments</comments><description>&lt;p&gt;ooh. This &lt;a href="http://en.wikipedia.org/wiki/Kanban"&gt;Kanban&lt;/a&gt; thing looks &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/08/24/introducing-kanban-at-xclaim.aspx"&gt;nice and shiney&lt;/a&gt;.&amp;#160; Will it “meme” and die, or will it stay and flourish, to be the next “xp”?&lt;/p&gt;  &lt;p&gt;Maybe it’s time to learn from our XP-Scrum experiences and evolve. Maybe Kanban is one path to that evolution. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6572481" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category></item><item><title>Over Specification in Tests</title><link>http://weblogs.asp.net/rosherove/archive/2008/07/12/over-specification-in-tests.aspx</link><pubDate>Sat, 12 Jul 2008 10:23:07 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6391567</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6391567</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/07/12/over-specification-in-tests.aspx#comments</comments><description>&lt;p&gt;I've gotten the chance to visit and consult various companies and I see this all the time: Over specification in tests, &lt;a href="http://weblogs.asp.net/rosherove/archive/2007/09/16/mocks-and-stubs-the-difference-is-in-the-flow-of-information.aspx"&gt;especially when doing mocks and stubs&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;One main reason for that is that people use their stub as a mock object (stubs are fake objects that we will not assert on so that we can test something else). here is a small example from something posted on the alt.net mailing list:&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;[Test]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;public void Can_Return_All_Plans()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;{&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;IPlanDao mockPlanDao = MockRepository.GenerateMock&amp;lt;IPlanDao&amp;gt;();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;mockPlanDao.Expect(x =&amp;gt; x.AllPlans(_fakeAdmin)).Return(new List&amp;lt;Plan&amp;gt;{_fakePlan});&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;PlanController planController = new PlanControllerForTesting(_mockCommonDao, _mockCommonService, mockPlanDao);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;ViewResult result = planController.All(false);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;mockPlanDao.VerifyAllExpectations();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;result.AssertViewResultNameAndViewDataType(typeof(PlanContainer), &amp;quot;Plans&amp;quot;);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;in this test the following line is used to &amp;quot;stub&amp;quot; out a return value into the system under test. &lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;mockPlanDao.Expect(x =&amp;gt; x.AllPlans(_fakeAdmin)).Return(new List&amp;lt;Plan&amp;gt;{_fakePlan});&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;no problem here. The problem lies in the last two lines of the test:&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;mockPlanDao.VerifyAllExpectations(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="cou" color="#800000"&gt;result.AssertViewResultNameAndViewDataType(typeof(PlanContainer), &amp;quot;Plans&amp;quot;); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the second line (the assert) is probably the thing you really want to test. but the call to &amp;quot;verifyAllExpectations&amp;quot; is the one that makes the test very fragile. It is &amp;quot;asserting&amp;quot; that someone has actually called &amp;quot;GetAllPlans()&amp;quot; to get the results, when it clearly does not matter how one got the results. all that matters is that:&lt;/p&gt;  &lt;p&gt;&amp;quot;Given a set of results returned into the application under test, the view in the controller is correct&amp;quot; (the translation of the last line in the test).&lt;/p&gt;  &lt;p&gt;If by any chance the application later does several more calls to the stubbed out dao, or uses a different method to get results, the test could break, even though the application would still ultimately work with the same end result.&lt;/p&gt;  &lt;p&gt;It's like me ordering a pizza delivery and then asking the delivery guy &amp;quot;did you get here by car or motorcycle?&amp;quot; . I realy don't care, as long as the end result: PIZZA, is correct.&lt;/p&gt;  &lt;p&gt;So the general rules for me are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If you see both &amp;quot;Verify&amp;quot; and &amp;quot;Assert&amp;quot; in the same test, it is usualy a smell of over specified tests&lt;/li&gt;    &lt;li&gt;if you see &amp;quot;expect&amp;quot; and &amp;quot;Return&amp;quot; on a fake object, make sure that you name it &amp;quot;stubXX&amp;quot; or &amp;quot;mockXX&amp;quot; so that you can distinguish whether you want to call verify on it later or not(most cases should be &amp;quot;not&amp;quot;)&lt;/li&gt;    &lt;li&gt;Try to test on the end result or end state rather than verify interactions.&amp;#160; The only time you &lt;em&gt;absolutely have not choice&lt;/em&gt; but to test an interaction using verify is when calling &lt;em&gt;void&lt;/em&gt; methods on external objects. that is clearly a one-way communication and &lt;em&gt;is (or part of)the end result&lt;/em&gt; of what you are trying to accomplish.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A lot of people think that adding that extra &amp;quot;verify&amp;quot; just means it is a good thing since they are doing more assert. Well, they sure are testing more things, but they are &lt;em&gt;internal&lt;/em&gt; things to the app's behavior and that is usually leading to brittle tests. Try to test on the end result or end state rather than verify interactions. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6391567" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item><item><title>A sneak Preview of Typemock Racer : Thread Deadlock Finder</title><link>http://weblogs.asp.net/rosherove/archive/2008/07/08/a-sneak-preview-of-typemock-racer.aspx</link><pubDate>Tue, 08 Jul 2008 15:42:28 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6376639</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>20</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6376639</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/07/08/a-sneak-preview-of-typemock-racer.aspx#comments</comments><description>&lt;p&gt;Here's a sneak preview of the upcoming &lt;a href="http://www.Typemock.com"&gt;Typemock&lt;/a&gt; Racer product, which I'm currently working on. We should be out in private CTP in a couple of weeks I hope.&lt;/p&gt;  &lt;p&gt;Typemock Racer tries to solve one huge problem for developers working in multi threaded environments: Detecting code that can result in deadlocks or race conditions. It does this by providing a framework API which you can use in your tests (under NUnit for example), that allows you to execrise your code under test until it finds a deadlock or times out.&lt;/p&gt;  &lt;p&gt;Here's an example of how you'd use it. Consider the following class which has two methods, that if run by two seperate threads, can result in a deadlock condition:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="433" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_thumb.png" width="328" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;At some point in time the threads could execute such that thread 1 is waiting on resource b, which is held by thread two , which is waiting on resource a, held by thread 1 - a pure deadlock.&lt;/p&gt;  &lt;p&gt;Given this class we can write a test that looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="217" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_thumb_1.png" width="542" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The ThreadTest class has an &amp;quot;AddThreadAction&amp;quot; method that receives a delegate. you can use it to invoke your own code, it will be invoked in a different thread. IN this example we are creating two threads, each one running a different method on MyClassWithLocks.&lt;/p&gt;  &lt;p&gt;We can just right click and run the test with TestDriven.NET to recieve the following results:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="294" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_thumb_3.png" width="569" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The output states that there is a deadlock that was found, with the exact steps that happened (with line locations) to reproduce this.&lt;/p&gt;  &lt;p&gt;It currently only works with lock (monitor.Enter\Exit) but will support all locking constructs in .NET.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What if the methods you point to create their own threads? Like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_10.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="502" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_thumb_4.png" width="568" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here is the output that you'd get if you run this test:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_12.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="448" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/AsneakPreviewofTypemockRacer_10517/image_thumb_5.png" width="661" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6376639" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Cool+Tools/default.aspx">Cool Tools</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item><item><title>Is Moq too poweful?</title><link>http://weblogs.asp.net/rosherove/archive/2008/07/06/is-moq-too-poweful.aspx</link><pubDate>Sun, 06 Jul 2008 18:59:28 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6367602</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6367602</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/07/06/is-moq-too-poweful.aspx#comments</comments><description>&lt;p&gt;It's interesting to see the other mocking frameworks as they grow into maturity. Especially Moq &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/07/05/MockingprotectedmemberswithMoq.aspx"&gt;which has been getting loads&lt;/a&gt; of new features recently. The latest one is something which makes me feel a bit weird after reading all the things people fear in &lt;a href="http://www.typemock.com"&gt;Typemock Isolator&lt;/a&gt;:It seems that&amp;#160; &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/07/05/MockingprotectedmemberswithMoq.aspx"&gt;Moq now allows mocking protected fields&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;What's really interesting is that Daniel has chosen to actively allow this, and &lt;em&gt;hide&lt;/em&gt; the feature at the same time, as well as put it under a strict &lt;em&gt;optional request&lt;/em&gt;:&lt;/p&gt;  &lt;p&gt;you have to opt in for each code file where you'd like this ability by adding a special imports statement.&lt;/p&gt;  &lt;p&gt;So, the questions I have are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;What happened to &amp;quot;if it's not testable it's a design smell&amp;quot;? Is this a compromise or have people figured out that good design can take many forms, with tools being left to do the hard lifting?&lt;/li&gt;    &lt;li&gt;If you're going to add powerful &amp;quot;non classic&amp;quot; mocking ability to a framework, does adding it as a special &amp;quot;opt-in&amp;quot; feature make it OK? (this is what we are talking about doing with Typemock Isolator)&lt;/li&gt;    &lt;li&gt;If tomorrow Rhino.Mocks were to add the same feature or something even more powerful (statics?) how would people treat that?&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6367602" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category></item><item><title>Two Faced Commits - how the ALT.NET Community is becoming more and more dogmatic</title><link>http://weblogs.asp.net/rosherove/archive/2008/05/19/two-faced-commits-how-the-alt-net-community-is-becoming-more-and-more-dogmatic.aspx</link><pubDate>Mon, 19 May 2008 10:50:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6201193</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>37</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6201193</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/05/19/two-faced-commits-how-the-alt-net-community-is-becoming-more-and-more-dogmatic.aspx#comments</comments><description>&lt;p&gt;disclaimer: I work at Typemock. &lt;/p&gt;  &lt;p&gt;There is a big trend I am starting to notice in the "Advanced" unit testing community. That trend feels more and more like hypocrisy. Take &lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/05/18/mock_statics_without_typemock.aspx" mce_href="http://www.clariusconsulting.net/blogs/kzu/archive/2008/05/18/mock_statics_without_typemock.aspx"&gt;Daniel's post about mocking statics without Typemock&lt;/a&gt;. (Daniel is the creator of &lt;a href="http://mockframeworks.com/moq" mce_href="http://mockframeworks.com/moq"&gt;Moq&lt;/a&gt;, an open source mocking framework) Granted, it is important to know that you can always refactor things for testability, but just looks at what he writes:&lt;/p&gt;  &lt;p&gt;"So, don't buy a product just because you're lazy and want to avoid creating a few wrapper classes and interfaces"&lt;/p&gt;  &lt;p&gt;followed by&lt;/p&gt;  &lt;p&gt;"Always use the simplest thing that could possibly work."&lt;/p&gt;  &lt;p&gt;Which is it, community? The idea of being prgamatic is using the right tool for the job. if that tools makes your job easier than not using it "cause you're lazy otherwise" is plain old hypocrisy. &lt;/p&gt;  &lt;p&gt;The same argument also holds for tools like FinalBuilder vs. Nant\MsBuild\Other XML Hell. Tools don't create problems if you use them correctly.&amp;nbsp; The community (especially the ALT.NET community) is going in a too extreme direction. so extreme that their advice are sometimes skewed too much to be considered pragmatic, sometimes falling into "dogmatic". &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6201193" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/General+Software+Development/default.aspx">General Software Development</category></item><item><title>Tough Questions about unit testing - Your comments required</title><link>http://weblogs.asp.net/rosherove/archive/2008/05/18/tough-questions-about-unit-testing-your-comments-required.aspx</link><pubDate>Sun, 18 May 2008 17:30:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6200703</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;As part of &lt;a href="http://the.artofunittesting.com" mce_href="http://the.artofunittesting.com"&gt;My Book&lt;/a&gt; I have a chapter on the challenges of integrating unit testing practices into an organization. One of the sections deals with "Tough questions and answers". In short, what are the tough questions you will have to deal with when introducing unit testing. &lt;/p&gt;  &lt;p&gt;here are the questions I've come across but I'd love to see if there are some that I am missing. Also, I am looking for great answers and references as responses to these questions. Your comments are appreciated:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;1 How much time will this add to the current process? &lt;/li&gt;    &lt;li&gt;2 Will my QA job be at risk because of this? &lt;/li&gt;    &lt;li&gt;3 How do we know this is actually working? &lt;/li&gt;    &lt;li&gt;4 How much time will this add to the current process? &lt;/li&gt;    &lt;li&gt;5 Is there proof that unit testing helps? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;- any other tough questions?&lt;/p&gt;  &lt;p&gt;- Got good answers?&lt;/p&gt;  &lt;p&gt;&lt;b&gt; Comments:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I'm using a beta test of Disqus.com's comments INSIDE this post so please try to respond there:&lt;/p&gt;  &lt;div id="disqus_thread"&gt;&lt;a href="http://iserializable.disqus.com/" mce_href="http://iserializable.disqus.com/"&gt;Discuss this topic on Disqus.&lt;/a&gt;&lt;/div&gt; &lt;script src="http://disqus.com/forums/iserializable/embed.js" mce_src="http://disqus.com/forums/iserializable/embed.js" type="text/javascript"&gt;&lt;/script&gt;&lt;style type="text/css" media="screen"&gt;
	 #dsq-content #dsq-comments .dsq-comment {	 list-style-type: none;	 padding: 0;	 margin: 0;	 border: 0;	 }	 #dsq-content #dsq-comments .dsq-comment {	 margin-bottom: 20px;	 }	 #dsq-content #dsq-comments .dsq-comment-rate {	 float: left;	 line-height: 1.22em;	 *margin-top: 15px;	 }	 #dsq-content #dsq-comments .dsq-comment-rate a,	 #dsq-content #dsq-comments .dsq-comment-rate img {	 border: 0;	 margin: 0;	 padding: 0;	 background-color: transparent;	 }	 #dsq-content #dsq-comments .dsq-arrows,	 #dsq-content #dsq-comments .not-votable .dsq-arrows:hover {	 opacity: .25;	 filter: alpha(opacity=25);	 _width: 16px;	 _height: 14px;	 }	 #dsq-content #dsq-comments .dsq-arrows.voted {	 opacity: .5;	 filter: alpha(opacity=50);	 }	 #dsq-content #dsq-comments .dsq-arrows:hover {	 opacity: 1;	 filter: alpha(opacity=100);	 }	 #dsq-content #dsq-comments .dsq-arrows img {	 _width: 16px;	 _height: 14px;	 }	 #dsq-content #dsq-comments .dsq-comment-header {	 margin-left: 20px;	 background: url('http://media.disqus.com/images/embed/header-grey.png') repeat-x;	 height: 30px;	 line-height: 30px;	 height: 38px;	 line-height: 38px;	 }	 #dsq-content #dsq-comments .dsq-comment.special .dsq-comment-header {	 background: url('http://media.disqus.com/images/embed/header-blue.png') repeat-x;	 }	 #dsq-content #dsq-comments .dsq-comment-header a {	 text-decoration: none;	 }	 #dsq-content #dsq-comments .dsq-header-avatar {	 position: relative;	 float: left;	 width: 32px;	 height: 34px;	 margin-top: -2px;	 height: 43px;	 width: 40px;	 }	 #dsq-content #dsq-comments .dsq-header-avatar.dsq-menu-on,	 #dsq-content #dsq-comments .dsq-header-avatar:hover{	 background: url('http://media.disqus.com/images/embed/avatar-frame-32.png') no-repeat top left;	 cursor: pointer;	 z-index: 9999;	 }	 #dsq-content #dsq-comments .dsq-header-avatar img{	 float: left;	 margin: 4px;	 width: 32px;	 height: 32px;	 }	 #dsq-content #dsq-comments .dsq-header-avatar .dsq-menu img {	 height: 8px;	 width: 7px;	 display: inline;	 float: none;	 margin-bottom: -1px;	 }	 #dsq-content #dsq-comments .dsq-comment-header cite {	 float: left;	 font-style: normal;	 font-weight: bold;	 margin: 0 3px;	 line-height: inherit;	 cursor: pointer;	 }	 #dsq-content #dsq-comments .dsq-comment-header cite a {	 line-height: inherit;	 }	 #dsq-content #dsq-comments .dsq-comment-header .dsq-header-meta {	 font-size: 90%;	 line-height: inherit;	 }	 #dsq-content #dsq-comments a.dsq-header-time{	 margin: 0 5px;	 color: inherit;	 line-height: inherit;	 }	 #dsq-content #dsq-comments span.dsq-header-points{	 margin: 0 5px;	 color: inherit;	 line-height: inherit;	 }	 #dsq-content #dsq-comments .dsq-comment-body{	 margin-left: 20px;	 padding-top: 5px;	 }	 #dsq-content #dsq-comments .dsq-comment-footer {	 font-size: 90%;	 margin: 10px 0 0 20px;	 }	 #dsq-content #dsq-comments .dsq-footer-alert {	 text-align: right;	 }	 #dsq-content #dsq-comments .dsq-header-avatar .dsq-menu {	 display: none;	 }	 #dsq-content #dsq-comments .dsq-header-avatar .dsq-menu {	 float: left;	 left: 0px;	 position: relative;	 _position: absolute;	 _top: 30px;	 background: #f0f0f0;	 z-index: 2;	 border-left: 1px solid #888;	 border-right: 1px solid #888;	 border-bottom: 1px solid #888;	 -moz-border-radius: 0px 0px 4px 4px;	 -webkit-border-bottom-right-radius: 4px;	 -webkit-border-bottom-left-radius: 4px;	 display: inline;	 padding: 5px 10px 5px 0;	 }	 #dsq-content #dsq-comments .dsq-menu li{	 float: left;	 clear: both;	 line-height: 1.3em;	 font-size: 12px;	 margin-bottom: 2px;	 margin-left: 4px;	 white-space: nowrap;	 }	 #dsq-content #dsq-comments .dsq-menu li a.dsq-admin-toggle {	 font-weight: bold;	 }	 #dsq-content #dsq-comments .dsq-menu li.admin-email,	 #dsq-content #dsq-comments .dsq-menu li.admin-ip {	 color: #555;	 font-style: italic;	 cursor: default;	 }	 #dsq-content #dsq-comments .dsq-menu li.admin-ip {	 padding-bottom: 3px;	 border-bottom: 1px dotted #aaa;	 cursor: default;	 }	 #dsq-content #dsq-comments .dsq-menu li a{	 text-decoration: none;	 color: #333;	 }	 #dsq-content #dsq-comments .dsq-menu li a:hover {	 color: #869aad;	 }	 #dsq-content #dsq-comments .dsq-menu-clout{	 margin: 6px 0;	 width: 72px;	 height: 32px;	 background: url('http://media.disqus.com/images/embed/clout-background.png') no-repeat top left;	 }	 #dsq-content #dsq-comments .dsq-menu-clout.unverified{	 background: url('http://media.disqus.com/images/embed/unverified-background.png') no-repeat top left;	 }	 #dsq-content #dsq-comments .dsq-menu-clout a{	 float: left;	 width: 100%;	 text-align: center;	 color: #fff;	 font-size: 16px;	 font-weight: bold;	 margin-top: 5px;	 }	 #dsq-content #dsq-comments .dsq-menu-clout.unverified a{	 font-size: 10px;	 font-weight: normal;	 }	 #dsq-content #dsq-comments .dsq-menu-clout a:hover{	 color: #fff;	 }	 img.dsq-record-img {	 border: 0;	 padding: 0;	 margin: 0;	 float: none;	 text-indent: 0;	 background: none;	 }	 a.dsq-brlink {	 font-size: 90%;	 color: #666;	 text-decoration: none;	 font-family: trebuchet ms, trebuchet, verdana, arial, sans-serif;	 }	 span.logo-disqus {	 font-family: trebuchet ms, trebuchet, verdana, arial, sans-serif;	 font-size: 95%;	 text-transform: uppercase;	 color: #64747d;	 font-weight: bold;	 }	 span.logo-disq {	 font-family: trebuchet ms, trebuchet, verdana, arial, sans-serif;	 font-size: 95%;	 text-transform: uppercase;	 color: #64747d;	 font-weight: bold;	 }	 span.logo-us {	 font-family: trebuchet ms, trebuchet, verdana, arial, sans-serif;	 font-size: 95%;	 text-transform: uppercase;	 color: #ff9300;	 font-weight: bold;	 }	 #disqus_thread #dsq-content {	 text-align: left;	 font-family: inherit;	 font-size: 13px;	 }	 #disqus_thread #dsq-content iframe {	 width: 100%;	 height: 280px;	 background-color: transparent;	 }	 #disqus_thread #dsq-content iframe.dsq-post-video {	 height: 370px;	 overflow: hidden;	 }	 .clearfix:after {	 content:".";	 display: block;	 height: 0;	 clear: both;	 visibility: hidden;	 }	 #dsq-content #dsq-comments img.icon-adjust {	 margin-bottom: -3px;	 }	 #disqus_thread #dsq-content ul,	 #dsq-content #dsq-comments ul,	 #dsq-content #dsq-comments li,	 #dsq-content #dsq-comments ol,	 #dsq-content #dsq-comments div,	 #dsq-content #dsq-comments p,	 #dsq-content #dsq-comments a,	 #dsq-content #dsq-comments cite,	 #dsq-content #dsq-comments img {	 border: 0;	 padding: 0;	 margin: 0;	 float: none;	 text-indent: 0;	 background: none;	 }	 #dsq-content #dsq-comments img {	 max-width: none;	 }	 #dsq-content #dsq-extra-links li,	 #dsq-content #dsq-comments ul,	 #dsq-content #dsq-comments li,	 #dsq-content #dsq-comments ol {	 list-style-type: none;	 list-style-image: none;	 background: none;	 display: block;	 }	 #dsq-content #dsq-extra-links li:before,	 #dsq-content #dsq-comments li:before {	 content: "";	 }	 #dsq-content #dsq-msg-closed,	 #dsq-content #dsq-post-add {	 margin: 0 0 10px 0;	 }	 #dsq-content #dsq-comments {	 width: 100%;	 list-style-type: none;	 padding: 0;	 border: 0;	 }	 #dsq-content #dsq-comments .dsq-remove-message {	 color: #555;	 list-style-type: none;	 margin: 10px 0;	 padding: 5px;	 border: 1px solid #c03000;	 background-color: #fddfd0;	 }	 #dsq-content #dsq-message {	 color: #555;	 margin: 10px 0;	 padding: 5px;	 background-color: #fdf1d0;	 border: 1px solid #fad163;	 }	 #dsq-content #dsq-comments .dsq-comment-header .dsq-hl-up {	 background-color: #92c72a;	 color: #fff;	 margin:0pt 5px;	 padding:0 2px;	 }	 #dsq-content #dsq-comments .dsq-comment-header .dsq-hl-down {	 background-color: #c03000;	 color: #fff;	 margin:0pt 5px;	 padding:0 2px;	 }	 #dsq-content #dsq-comments .dsq-hl-anchor {	 background-color: #ffff99 !important;	 color: #000 !important;	 }	 #dsq-content #dsq-comments .dsq-hl-anchor p {	 color: #000 !important;	 }	 #dsq-content #dsq-comments .dsq-hl-anchor a {	 color: #000 !important;	 }	 /* ------ outside comment list ------ */	 #dsq-content #dsq-auth .dsq-auth-header{	 margin-bottom: 10px;	 }	 #dsq-content h3 { margin: 10px 0; }	 #disqus_thread #dsq-content h3 {	 font-weight: bold;	 }	 #dsq-content #dsq-auth .dsq-by {	 float: right;	 }	 #dsq-content #dsq-auth img,	 #dsq-content #dsq-options-toggle img {	 border: 0;	 margin: 0;	 padding: 0;	 max-width: none;	 float: none;	 }	 #dsq-content #dsq-options {	 margin-bottom: 20px;	 }	 #dsq-options .dsq-extra-meta {	 background: transparent url('http://media.disqus.com/images/embed/transp-line-10.png') repeat-x top center;	 margin-top:10px;	 padding-top:10px;	 }	 #dsq-extra-links {	 margin-top: 15px;	 font-size: 90%;	 }	 #dsq-extra-links img {	 margin-bottom: -3px;	 }	 /* ------- pagination -------- */	 #dsq-content #dsq-pagination {	 margin-bottom: 10px;	 }	 #dsq-content #dsq-pagination a {	 font-weight: bold;	 }	 /* ------- popup div -------- */	 #dsq-popup-profile h4,	 #dsq-popup-profile ul,	 #dsq-popup-profile li,	 #dsq-popup-profile ol,	 #dsq-popup-profile div,	 #dsq-popup-profile p,	 #dsq-popup-profile a,	 #dsq-popup-profile cite,	 #dsq-popup-profile img {	 border: 0;	 padding: 0;	 margin: 0;	 float: none;	 text-indent: 0;	 background: none;	 }	 #dsq-popup-profile img {	 max-width: none;	 }	 #dsq-popup-profile ul,	 #dsq-popup-profile li,	 #dsq-popup-profile ol {	 list-style-type: none;	 list-style-image: none;	 background: none;	 display: block;	 }	 #dsq-popup-profile li:before {	 content: "";	 }	 #dsq-popup-profile {	 padding: 0;	 border: 0;	 }	 .dsq-popupdiv {	 color: #333;	 display: none;	 position: absolute;	 z-index: 9999;	 }	 .dsq-popupdiv p {	 color: #222;	 line-height: 1.22em;	 }	 .dsq-popupdiv a {	 color: #1c5392;	 }	 .dsq-popupdiv a:hover {	 color: #869aad;	 }	 #dsq-popup-profile {	 text-align: left;	 width: 500px;	 _background: transparent url(http://media.disqus.com/images/embed/popup-body.png) repeat-y;	 }	 #dsq-popup-profile #dsq-popup-top {	 text-align: right;	 width: 500px;	 height: 20px;	 background: transparent url(http://media.disqus.com/images/embed/popup-top.png) no-repeat;	 }	 #dsq-popup-profile #dsq-popup-top img {	 margin: 12px 13px 0 0;	 *margin: 12px 13px 0 0;	 }	 #dsq-popup-profile #dsq-popup-bottom {	 text-align: right;	 width: 500px;	 height: 20px;	 background: transparent url(http://media.disqus.com/images/embed/popup-bottom.png) no-repeat;	 }	 #dsq-popup-profile #dsq-popup-body div.powered-by{	 font-size: 90%;	 text-align: right;	 padding-right: 15px;	 }	 #dsq-popup-profile  #dsq-popup-body {	 width: 500px;	 background: transparent url(http://media.disqus.com/images/embed/popup-body.png) repeat-y;	 }	 #dsq-popup-profile #dsq-popup-body #dsq-popup-body-padding {	 padding: 0 15px;	 font-size: 13px;	 }	 #dsq-popup-profile #dsq-popup-body #dsq-popup-body-padding cite {	 font-weight: bold;	 font-size: 150%;	 font-style: normal;	 }	 #dsq-popup-profile #dsq-popup-body #dsq-popup-body-padding cite a{	 text-decoration: none;	 }	 #dsq-popup-profile #dsq-popup-body #dsq-popup-body-padding .dsq-popup-profilelink {	 margin: 0 0 0 5px;	 font-size: 90%;	 }	 #dsq-popup-profile .dsq-clout {	 float: left;	 width: 72px;	 height: 32px;	 line-height: 32px;	 background: url('http://media.disqus.com/images/embed/clout-background.png') no-repeat top left;	 }	 #dsq-popup-profile .dsq-clout.unverified {	 background: url('http://media.disqus.com/images/embed/unverified-background.png') no-repeat top left;	 line-height: 24px;	 }	 #dsq-popup-profile .dsq-clout a{	 float: left;	 width: 100%;	 text-align: center;	 color: #fff;	 font-size: 16px;	 font-weight: bold;	 text-decoration: none;	 }	 #dsq-popup-profile .dsq-clout.unverified a{	 font-size: 11px;	 font-weight: normal;	 }	 #dsq-popup-profile .dsq-clout a:hover {	 color: #fff;	 }	 #dsq-popup-profile #dsq-profile-services {	 float: left;	 margin-left: 10px;	 border: 2px solid #d7dbdd;	 padding: 3px 5px;	 -moz-border-radius: 1em;	 -webkit-border-radius: 1em;	 }	 #dsq-popup-profile #dsq-profile-services a {	 position: relative;	 text-decoration: none;	 }	 #dsq-popup-profile #dsq-profile-services span.dsq-services-description {	 font-size: 85%;	 color: #555;	 position: absolute;	 top: 25px;	 left: 5px;	 display: none;	 white-space: nowrap;	 }	 #dsq-popup-profile #dsq-clout-label {	 margin-top: 5px;	 font-size: 85%;	 color: #555;	 visibility: hidden;	 clear: both;	 padding-left: 10px;	 }	 #dsq-popup-profile #dsq-profile-services img {	 margin: 0 7px;	 border:2px solid #d8e7fa;	 }	 #dsq-popup-profile #dsq-profile-follow,	 #dsq-popup-profile .dsq-profile-claim {	 float: left;	 margin-left: 10px;	 font-size: 95%;	 font-weight: bold;	 line-height: 20px;	 }	 #dsq-popup-profile #dsq-profile-status,	 #dsq-popup-profile #dsq-profile-recentcomments {	 clear: both;	 margin: 10px 0 0 0;	 }	 #dsq-popup-profile #dsq-profile-status h4,	 #dsq-popup-profile #dsq-profile-recentcomments h4 {	 font-size: 110%;	 border-bottom: 2px solid #d7dbdd;	 margin-bottom: 10px;	 }	 #dsq-popup-profile #dsq-profile-status h4 span,	 #dsq-popup-profile #dsq-profile-recentcomments h4 span {	 background-color: #d7dbdd;	 padding: 2px 5px;	 color: #555;	 font-weight: bold;	 }	 #dsq-popup-profile #dsq-profile-status p {	 font-style: italic;	 }	 #dsq-popup-profile ul#dsq-profile-commentlist {	 font-size: 95%;	 line-height: 1.75em;	 }	 #dsq-popup-profile #dsq-profile-commentlist li{	 padding: 5px 0;	 border-bottom: 2px solid #e9ebed;	 }	 #dsq-popup-profile #dsq-profile-commentlist li img.avatar-small {	 width: 24px;	 height: 24px;	 border: 1px solid #ddd;	 float: left;	 }	 #dsq-popup-profile #dsq-profile-commentlist li p.comment-message {	 margin-left: 30px;	 *float: left;	 *margin-left: 5px;	 }	 #dsq-popup-profile #dsq-profile-commentlist li span.comment-meta {	 clear: both;	 margin-left: 30px;	 display: block;	 font-size: 90%;	 }	 #dsq-popup-profile #dsq-profile-commentlist li:hover {	 background-color: #efefef;	 }	 #dsq-popup-profile #dsq-profile-commentlist span{	 color: #666;	 font-size: 95%;	 }	 &lt;/style&gt;&lt;noscript&gt;&lt;/noscript&gt;&lt;a href="http://disqus.com" class="dsq-brlink" mce_href="http://disqus.com"&gt;blog comments powered by &lt;span class="logo-disqus"&gt;Disqus&lt;/span&gt;&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6200703" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item><item><title>Agile Rejection Letter</title><link>http://weblogs.asp.net/rosherove/archive/2008/05/12/agile-rejection-letter.aspx</link><pubDate>Mon, 12 May 2008 23:51:51 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6184468</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6184468</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/05/12/agile-rejection-letter.aspx#comments</comments><description>&lt;p&gt;&amp;quot;Dear Roy,   &lt;br /&gt;Thank you for your submission to the Developer Jam stage, entitled &amp;quot;Advanced Unit Testing Patterns, Tips and Tricks with examples in .NET&amp;quot;.&amp;#160; We received a number of great submissions for the stage--more than could fit in the space &amp;amp; time available, of course.    &lt;br /&gt;To select sessions for inclusion, the Developer Jam review committee (see &lt;a href="http://www.agile2008.org/stage-developers.html"&gt;http://www.agile2008.org/stage-developers.html&lt;/a&gt;) used a ranking system to indicate which sessions they would most like to see as part of the stage.&amp;#160;&amp;#160; We averaged the numerical rankings from all of the committee members to select the proposals with the most interest.    &lt;br /&gt;Unfortunately, your submission was not ranked highly enough to be included in the final program.&amp;quot;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;When will I cross the glass ceiling?&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6184468" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category></item><item><title>NullObject.For&lt;T&gt; - As simple as it gets, but no simpler</title><link>http://weblogs.asp.net/rosherove/archive/2008/05/10/nullobject-for-lt-t-gt-as-simple-as-it-gets-but-no-simpler.aspx</link><pubDate>Sat, 10 May 2008 21:19:11 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6176841</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6176841</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/05/10/nullobject-for-lt-t-gt-as-simple-as-it-gets-but-no-simpler.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.paulstovell.com/blog/nullobjectfor"&gt;This NullObject Factory&lt;/a&gt; from Paul is very nice, simple and clean in its design. I really like it and I can see many uses for it, in parallel with working with your standard &lt;a href="http://www.typemock.com"&gt;mocking framework&lt;/a&gt; or &lt;a href="http://martinfowler.com/articles/injection.html"&gt;IoC Container Implementation&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;here is a little usage example (last line):&lt;/p&gt;  &lt;pre&gt;var controller = new AccountController(         // Class I am testing
    mockCustomerRepository,                     // Class I am mocking
    &lt;strong&gt;NullObject.For&amp;lt;ILogger&amp;gt;()&lt;/strong&gt;);                 // Who cares about logging!&lt;/pre&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6176841" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item><item><title>Unit Testing Denial Pattern #1: Pretending the test is no longer valid</title><link>http://weblogs.asp.net/rosherove/archive/2008/04/30/unit-testing-denial-pattern-1-pretending-the-test-is-no-longer-valid.aspx</link><pubDate>Wed, 30 Apr 2008 20:21:26 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6145763</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6145763</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/04/30/unit-testing-denial-pattern-1-pretending-the-test-is-no-longer-valid.aspx#comments</comments><description>&lt;p&gt;Today was both a good day for e and a bad day for me. Good day because I managed to get a full suite of tests that were somehow failing to work again after a refactoring that got out of hand. Bad - because out of all the tests, one of them failed. &lt;/p&gt;  &lt;p&gt;Here's the part I'm ashamed of:&lt;/p&gt;  &lt;p&gt;I was working with a pair, and when we both looked at the failing test, I went out and said &amp;quot;Oh, I think this test is no longer valid. It may just need to be removed&amp;quot;. We both knew it was still a valid test, that for some reason was failing. But I was on such a role with making everything work, that test was feeling like a thorn in my thumb that I wanted to get rid of. &lt;/p&gt;  &lt;p&gt;It was a hard few minutes to convince ourselves to debug through the test and realize what the problem may be&lt;/p&gt;  &lt;p&gt;So, denial pattern #1:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Forces&lt;/strong&gt;: You just want to get on with your code, with only one or two tests that are &amp;quot;ruining the party&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Behavior:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Instead of fixing them debugging them or accepting that you might not have fixed everything, you try to tell yourself that the tests may no longer be valid without actually checking your assumption, which you really wish would be true. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How to avoid&lt;/strong&gt;: work in pairs. It's harder to ignore a problem (or at least more awkward) with 4 eyes staring at it.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6145763" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Testing+Guidelines/default.aspx">Testing Guidelines</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item><item><title>Testing XML serialization attributes</title><link>http://weblogs.asp.net/rosherove/archive/2008/04/24/testing-xml-serialization-attributes.aspx</link><pubDate>Fri, 25 Apr 2008 02:42:23 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6128913</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6128913</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/04/24/testing-xml-serialization-attributes.aspx#comments</comments><description>&lt;p&gt;Not sure how I feel about &lt;a href="http://www.sharpregion.com/post/Give-back-to-your-testing-framework.aspx"&gt;this particular brand of testing syntax&lt;/a&gt;. still, it's good that someone thought this problem through - testing xml serialization attributes.&lt;/p&gt;  &lt;p&gt;[via &lt;a href="http://feeds.feedburner.com/~r/ReflectivePerspective/~3/276708890/"&gt;the morning brew&lt;/a&gt;]&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6128913" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Testing+Guidelines/default.aspx">Testing Guidelines</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item><item><title>Future of Mock Frameworks: AEIS - Abstract Expectations &amp; Isolation Syntax</title><link>http://weblogs.asp.net/rosherove/archive/2008/02/14/future-of-mock-frameworks-aeis-abstract-expectations-amp-isolation-syntax.aspx</link><pubDate>Thu, 14 Feb 2008 23:10:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5790456</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>21</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=5790456</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/02/14/future-of-mock-frameworks-aeis-abstract-expectations-amp-isolation-syntax.aspx#comments</comments><description>&lt;p&gt;As I was &lt;a href="http://weblogs.asp.net/rosherove/archive/2008/01/17/the-evolution-of-unit-testing-and-syntax.aspx"&gt;looking back and forward&lt;/a&gt; on the changing syntax of testing and mock frameworks, it occurs to me that there are still things that need to be solved in the mocking space. many things.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;It's hard to choose &lt;/strong&gt;a framework and stick with it because they have different abilities which you are not sure you might need or not later on&lt;/li&gt;    &lt;li&gt;Each framework has &lt;strong&gt;different syntax &lt;/strong&gt;which is a learning curve and maintainable curve in test code&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;You can't change your mind &lt;/strong&gt;easily after you choose&lt;/li&gt;    &lt;li&gt;There is no specified set of known features to be expected. Each one has what it thinks is best.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What if we had an abstract layer on top of our mocking frameworks? Just like ADO.NET is an abstraction layer, and the Data Application block is an abstraction layer, NHibernate is an abstraction layer - Mocking frameworks are infrastructure libraries that, if looked at well enough, are pretty much trying to do the same things in different ways (like databases)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here are the main services a mocking framework can provide(if I miss something tell me):&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="margin-left: 1in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level2 lfo1"&gt;&lt;span style="font-family: " courier new"; mso-fareast-font-family: 'Courier New'"&gt;&lt;span style="mso-list: ignore"&gt;o&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Stubs&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1.5in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level3 lfo1"&gt;&lt;span style="font-family: wingdings; mso-fareast-font-family: wingdings; mso-bidi-font-family: wingdings"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#167;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Create Canned Answers&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level2 lfo1"&gt;&lt;span style="font-family: " courier new"; mso-fareast-font-family: 'Courier New'"&gt;&lt;span style="mso-list: ignore"&gt;o&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Mocks&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1.5in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level3 lfo1"&gt;&lt;span style="font-family: wingdings; mso-fareast-font-family: wingdings; mso-bidi-font-family: wingdings"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#167;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Create Expectations&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 2in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level4 lfo1"&gt;&lt;span style="font-family: symbol; mso-fareast-font-family: symbol; mso-bidi-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#183;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Record-Replay Model &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 2in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level4 lfo1"&gt;&lt;span style="font-family: symbol; mso-fareast-font-family: symbol; mso-bidi-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#183;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Explicit Model&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 2in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level4 lfo1"&gt;&lt;span style="font-family: symbol; mso-fareast-font-family: symbol; mso-bidi-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#183;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Parameter Constraints&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 2in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level4 lfo1"&gt;&lt;span style="font-family: symbol; mso-fareast-font-family: symbol; mso-bidi-font-family: symbol"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#183;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Custom param constraints &lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1.5in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level3 lfo1"&gt;&lt;span style="font-family: wingdings; mso-fareast-font-family: wingdings; mso-bidi-font-family: wingdings"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#167;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Partially Implemented Mocks&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1.5in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level3 lfo1"&gt;&lt;span style="font-family: wingdings; mso-fareast-font-family: wingdings; mso-bidi-font-family: wingdings"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#167;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Pass-through mocks&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1.5in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level3 lfo1"&gt;&lt;span style="font-family: wingdings; mso-fareast-font-family: wingdings; mso-bidi-font-family: wingdings"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#167;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Strict\non strict&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1.5in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level3 lfo1"&gt;&lt;span style="font-family: wingdings; mso-fareast-font-family: wingdings; mso-bidi-font-family: wingdings"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#167;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;IoC- Auto mocking containers&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level2 lfo1"&gt;&lt;span style="font-family: " courier new"; mso-fareast-font-family: 'Courier New'"&gt;&lt;span style="mso-list: ignore"&gt;o&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Mocking Abilities&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 1.5in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level3 lfo1"&gt;&lt;span style="font-family: wingdings; mso-fareast-font-family: wingdings; mso-bidi-font-family: wingdings"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#167;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Strict (Traditional Interface based)&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="margin-left: 1.5in; text-indent: -0.25in; mso-add-space: auto; mso-list: l0 level3 lfo1"&gt;&lt;span style="font-family: wingdings; mso-fareast-font-family: wingdings; mso-bidi-font-family: wingdings"&gt;&lt;span style="mso-list: ignore"&gt;&amp;#167;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span dir="ltr"&gt;&lt;/span&gt;Non Strict (Typemock,JMockit Stuff)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There are two main services here: &lt;strong&gt;Expectation&lt;/strong&gt; abilities, and &lt;strong&gt;Creation\Isolation&lt;/strong&gt; abilities. &lt;/p&gt;  &lt;p&gt;what if there was a framework that would allow you to write code like this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt; [Test]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateSimpleInterfaceBasedMock()
        {
            MockingEngine.Provider = &lt;span class="kwrd"&gt;new&lt;/span&gt; RhinoMocksProvider();
            IMock&amp;lt;ILogger&amp;gt; mockLogger =
                Represent.Type&amp;lt;ILogger&amp;gt;().AsMock();&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;        ...

        }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;What would the proposed AEIS (Abstract Expectation and Isolation Syntax) look like?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/FutureofMockFrameworksAEISAbstractExpect_3C0/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="403" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/FutureofMockFrameworksAEISAbstractExpect_3C0/image_thumb_1.png" width="375" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I would consist of a very thin API wrapper that allowed all the different services mocking frameworks do today, but it would not do this functionality on its own. instead it would use a &lt;strong&gt;provider model&lt;/strong&gt; that will allow one to write adapters for specific mocking frameworks, forwarding calls and translating the different syntaxes between AEIS and the specific framework. I will also have a rules engine (on the left) that will allow creating custom rules that will run when using various APIs (perhaps using an event driven relay) that will allow to enforce specific usage of specific features.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;what would be some of the benefits in something like this?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can change mocking frameworks without changing lots of code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is an investment to be made when choosing a mocking framework today: You spend time learning the syntax, you write tests with that syntax and you plan on not learning a new syntax to do slightly different things. A year later mock framework X comes in and you think that you'd like to use it, but you've already invested so much time and money in the original one that you aren't going to try. You lose valuable features just to avoid the risks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can add rules &amp;#8220;on top&amp;#8221; of the mocking framework&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An abstraction layer can have custom code that will allow you to write custom logic that makes sure developers are using the framework in a way that you'd like. for example, you'd like to use Typemock Isolator but you are afraid that people will abuse the ability to write tests for code that isn't &amp;quot;testable&amp;quot; by default (no interfaces etc..)&lt;/p&gt;

&lt;p&gt;I call that&amp;quot;Strict&amp;quot; mocking policy vs. &amp;quot;loose&amp;quot; mocking policy (or &amp;quot;classic\traditional vs. modern...&amp;quot;). So the&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; o&amp;#160;&amp;#160;&amp;#160; Allow only strict mocking syntax, for example&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;&lt;strong&gt;One syntax to remember and learn for all types of jobs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Simplify and overcome problematic mocking syntax in existing frameworks&lt;/p&gt;

&lt;p&gt;And there are definitely some around. For example, Typemock Isolator currently has a very confusing Mock() and MockObject() set of methods which sometimes I personally forget what each one does. Sure, we'll change it, but RhinoMocks also has some confusing syntax (PartialMocks() vs. DynamicMock() Vs. Mock()...)&lt;/p&gt;

&lt;p&gt;Having a top level API can help alleviate and standardize some of these issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provide a recipe for mock framework builders&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have to build a provider for your mocking framework, you have to have a contract of what you can and cannot provide. this will also help standardize the essential set of services that mocking frameworks provide today or at least, the set of things you need to consider when choosing among them as the underlying engine.
  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;It will help avoid religious wars (like design for testability) by allowing you to choose easily and enforce to your standards through the common API.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about testing frameworks? why not start there?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think currently most test frameworks (XUnit.net aside) are pretty much interchangeable (Nunit and MbUnit and msTest) so there is less pain there. However, take a look at the next version of MbUnit ,&amp;#160; &lt;a href="http://blog.benhall.me.uk/2007/12/mbunit-v3-and-gallio-automation.html"&gt;running on the Gallio automation platform&lt;/a&gt;) which tries to provide a generic test runner model for all test frameworks in .net. I think they are trying to solve the same set of pains and the same set of benefits.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5790456" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category></item></channel></rss>