<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Agile</title><link>http://www.agileprogrammer.com/dotnetguy/category/144.aspx</link><description>Agile</description><managingEditor>Brad Wilson</managingEditor><dc:language>en-US</dc:language><generator>.Text Version 0.95.2005.109</generator><item><dc:creator>Brad Wilson</dc:creator><title>xUnit.net RC1 Released Today</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/12/18/23915.aspx</link><pubDate>Tue, 18 Dec 2007 15:44:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/12/18/23915.aspx</guid><description>&lt;p&gt;We (&lt;a href="http://jamesnewkirk.typepad.com/"&gt;Jim Newkirk&lt;/a&gt; and myself) just shipped up the ZIP files for the first (and hopefully only) release candidate for xUnit.net today. This marks the first release where we've split the core of &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit.net&lt;/a&gt; (which is xunit.dll and xunit.console.exe) from the rest of the &lt;a href="http://www.codeplex.com/xunitext"&gt;xUnit.net extensions&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;While there is a download available for the &lt;a href="https://www.codeplex.com/xunit/Release/ProjectReleases.aspx?ReleaseId=8080"&gt;xUnit.net RC1&lt;/a&gt; release, you probably want to download the &lt;a href="http://www.codeplex.com/xunitext/Release/ProjectReleases.aspx?ReleaseId=8103"&gt;December 2007 Extensions for xUnit.net RC1&lt;/a&gt; release instead. It includes all the bits that are in the xUnit.net RC1 release, plus all the extension bits (such as the TD.NET runner, Resharper runner, etc.).&lt;/p&gt; &lt;p&gt;Our current plan, assuming there is no feedback about major bugs or missing functionality, is to release v1 in January.&lt;/p&gt; &lt;h3&gt;What's new in xUnit.net RC1&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Documentation! We've provided a .chm file with the xUnit.net API documentation, in both the xUnit.net binary download as well as a stand-alone download (for those evaluating xUnit.net).&lt;/li&gt; &lt;li&gt;Removed the "static" declaration from the Assert class. This won't change the usage of Assert, but does allow you to derive from Assert to create your own custom assertions.&lt;/li&gt; &lt;li&gt;Support static test methods, which makes xUnit.net easily usable from F# (see &lt;a href="http://devhawk.net/2007/12/12/Practical+F+Parsing+Unit+Testing.aspx"&gt;Harry Pierson's blog post&lt;/a&gt; for more information).&lt;/li&gt; &lt;li&gt;The console runner now runs in the STA so that xUnit.net can be used for web testing.&lt;/li&gt; &lt;li&gt;There are a few more... see the &lt;a href="https://www.codeplex.com/xunit/Release/ProjectReleases.aspx?ReleaseId=8080"&gt;release&lt;/a&gt; for more information.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;What's new in December 2007 Extensions&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;BREAKING CHANGE!&lt;/strong&gt; The theory data attributes were renamed from DataViaXxx to XxxData (i.e., DataViaProperty is now called PropertyData). We also added InlineData, which works much like the RowTest attribute from MbUnit. A [Theory] method can have multiple Data attributes associated with it, and they are all utilized.&lt;/li&gt; &lt;li&gt;Added AssumeIdentity extension&lt;/li&gt; &lt;li&gt;Added FrozenClock extension&lt;/li&gt; &lt;li&gt;Added Trace extension&lt;/li&gt; &lt;li&gt;Updated to support Resharper 3.1 EAP and x64 machines&lt;/li&gt;&lt;/ul&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23915.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Class &amp;quot;static&amp;quot; Decorator: Unintended Consequences</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/12/05/23886.aspx</link><pubDate>Wed, 05 Dec 2007 07:51:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/12/05/23886.aspx</guid><description>&lt;p&gt;If a class contains nothing but static members and methods, you can decorate the class with the "static" keyword. The purpose of the keyword is ostensibly as a form of documentation: this class has no instance data or methods, so therefore, you cannot "new" one of them up. Seems like an entirely reasonable thing to do. We did exactly that with the Assert class in &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit.net&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Unfortunately, it also has two (IMO unnecessary) side-effects: a static class is always sealed, and cannot derive from another class.&lt;/p&gt; &lt;p&gt;What this means is: if you have a static class, it cannot extend, and it cannot be extended. And since the new &lt;a href="http://msdn2.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic3"&gt;extension methods&lt;/a&gt; feature in &lt;a href="http://msdn2.microsoft.com/en-us/library/bb308966.aspx"&gt;C# 3.0&lt;/a&gt; can only add instance methods and not static methods, you're kinda stuck.&lt;/p&gt; &lt;p&gt;Just to be clear, this works fine:&lt;/p&gt;&lt;pre&gt;public class StaticBase
{
    public static void This() { }
}

public class StaticDerived : StaticBase
{
    public static void That() { }
}&lt;/pre&gt;
&lt;p&gt;But this doesn't:&lt;/p&gt;&lt;pre&gt;public static class StaticBase
{
    public static void This() { }
}

public static class StaticDerived : StaticBase
{
    public static void That() { }
}&lt;/pre&gt;
&lt;p&gt;Luckily, we caught this before we released xUnit.net 1.0. We're going to remove the static class decorator from Assert so that you can make your own Assert extensions class. The usage of Assert will not change, since the methods are all still static.&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23886.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>[FreezeClock] xUnit.net Extension</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/11/11/23751.aspx</link><pubDate>Sun, 11 Nov 2007 10:56:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/11/11/23751.aspx</guid><description>&lt;p&gt;I've just checked in my [FreezeClock] extension into xUnit.net Extensions project, the source for which is available right now in source form in &lt;a href="http://www.codeplex.com/xunitext/SourceControl/DirectoryView.aspx?SourcePath=&amp;amp;changeSetId=7544"&gt;change set 7544&lt;/a&gt;. This is a simplified version of a similar Clock class that we use internally in the CodePlex code itself.&lt;/p&gt; &lt;p&gt;The idea behind [FreezeClock] is simple. Rather than using DateTime.Now, DateTime.UtcNow, or DateTime.Today, instead you use Clock.Now, Clock.UtcNow, and Clock.Today. During normal operation, these Clock operations are just simple forwards on to their DateTime counterparts. (The Clock class is provided as part of the extension, in the XunitExt namespace.)&lt;/p&gt; &lt;p&gt;You can freeze the clock by calling one of Clock's FreezeXxx() methods. Then, until you call Thaw(), all the calls to Clock.Now, Clock.UtcNow, and Clock.Local will use the frozen values. The reason here is for testing purposes: when you have a frozen and consistent time, it makes comparisons against expected values much simpler, because you don't have an introduce "slop" into the comparison to take into the account the execution time of the test code.&lt;/p&gt; &lt;p&gt;In addition to the Clock class, the extension introduces an AOP-style before/after attribute that you can apply to your tests to automatically freeze and thaw the clock for you. For example:&lt;/p&gt;&lt;pre style="margin: 0px"&gt;[&lt;span style="color: #2b91af"&gt;Fact&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;FreezeClock&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; FrozenWithCurrentTime()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; result1 = &lt;span style="color: #2b91af"&gt;Clock&lt;/span&gt;.Now;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.Sleep(100);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; result2 = &lt;span style="color: #2b91af"&gt;Clock&lt;/span&gt;.Now;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.Equal(result1, result2);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;p&gt;Don't forget that the implications of date/time management also extend beyond your code. For example, when using this system, if you need to test dates &amp;amp; times that are placed into your database that are based on the current date &amp;amp; time, those values need to come from your .NET code (specifically, calling Clock.Now and friends) rather than using the date/time functions built into your database to populate those field values.&lt;/p&gt;
&lt;p&gt;Make sure to check out all the unit and acceptance tests to see how the classes work. For further discussion, please visit the corresponding &lt;a href="http://www.codeplex.com/xunitext/Thread/View.aspx?ThreadId=17694"&gt;Forum Post&lt;/a&gt;.&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23751.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Call for Presentations: Agile 2008</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/11/11/23750.aspx</link><pubDate>Sun, 11 Nov 2007 08:58:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/11/11/23750.aspx</guid><description>&lt;p&gt;Mitch has posted the &lt;a href="http://mitchlacey.com/content/view/31/33/"&gt;Call for Presentations&lt;/a&gt; for Agile 2008 in Toronto next summer.&lt;/p&gt;
&lt;p&gt;I went to Agile 2006, mostly because I was presenting (and there, mostly because Mitch came in at the 11th hour and shepherded the process along). While I sincerely enjoyed presenting, many of us lamented that something seemed to be missing from the conference. &lt;a href="http://www.peterprovost.org/"&gt;Peter&lt;/a&gt; summed it up best by saying that the soul -- the Zen -- of agility seemed to be missing. Everybody was talking about the mechanics, but nobody was talking about the organics.&lt;/p&gt;
&lt;p&gt;I didn't go to Agile 2007, partly because of that and partly because I was "saving" up my big trip for the PDC that never materialized. I'm thinking about trying to create a talk about agile philosophy for this year, but I'm not quite sure what I want to say. This &lt;a href="http://alarmingdevelopment.org/?p=79"&gt;blog post by Jonathan Edwards about Beautiful Code&lt;/a&gt; has been stewing in my brain for several months now...&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23750.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Calling All xUnit.net Extenders!</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/11/10/23748.aspx</link><pubDate>Sat, 10 Nov 2007 09:44:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/11/10/23748.aspx</guid><description>&lt;p&gt;We're rapidly approaching the point where we want to finalize what's going into the 1.0 version of &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit.net&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I know we made lots of big changes from &lt;a href="http://www.codeplex.com/xunit/Release/ProjectReleases.aspx?ReleaseId=7175"&gt;Beta 1&lt;/a&gt; to &lt;a href="http://www.codeplex.com/xunit/Release/ProjectReleases.aspx?ReleaseId=7389"&gt;Beta 2&lt;/a&gt;. We felt like these changes, while somewhat disrupting, provided a better foundation for xUnit.net going forward. We're not planning any more big sweeping changes; our feature &amp;amp; issue list for the proposed &lt;a href="http://www.codeplex.com/xunit/Release/ProjectReleases.aspx?ReleaseId=8080"&gt;Release Candidate 1&lt;/a&gt; is still relatively small.&lt;/p&gt; &lt;p&gt;You may have also noticed that we removed much of the source code from the xUnit.net project itself. All that remains is the source to xunit.dll and xunit.console.exe (and the associated unit tests). The rest of the source code -- including the TestDriven.NET and Resharper runners -- has been moved to the &lt;a href="http://www.codeplex.com/xunitext"&gt;xUnit.net Extensions&lt;/a&gt; project. The Extensions project will issue releases at the same time as the xUnit project, with the first release being extensions suitable for use with RC1.&lt;/p&gt; &lt;p&gt;By keeping a tight core with well-defined and well-used extension points, we're hoping that releases of xUnit.net itself will be very infrequent; ideally, we release 1.0 and never have to release again. Ideally. :)&lt;/p&gt; &lt;p&gt;We believe that most of the activity will move to the xUnit.net Extensions project, hopefully with many community contributions, both inside and outside of Microsoft. Yes, we are planning to accept community contributions!&lt;/p&gt; &lt;p&gt;The call to action today, then, is two-fold.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;First&lt;/em&gt;&lt;/strong&gt;, if you think there are any missing features and/or outstanding bugs in the core of xUnit.net itself (that is, in xunit.dll and the console runner xunit.console.exe), now is the time to speak up. If you haven't already, please start using Beta 2 and let us know what's missing from the core.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Second&lt;/em&gt;&lt;/strong&gt;, there is an open issue for the Release Candidate titled &lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=2081"&gt;Flesh out ITypeInfo, IMethodInfo, IAttributeInfo&lt;/a&gt;. These three interfaces are used within the runner infrastructure to determine which classes contain tests, which methods are tests, and which attributes they are decorated with.&lt;/p&gt; &lt;p&gt;These interfaces aren't nearly as full featured as their reflection counterparts. They contain just enough information for the xUnit.net runner infrastructure to be able to inspect and run our own test types (plus our NUnit extension, [RunWithNUnit]). Since these interfaces are defined in the core xunit.dll library, we'd like to know which things are missing from them that would be required by extenders.&lt;/p&gt; &lt;p&gt;Specifically:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;People implementing ITestClassCommand (for [RunWith()] support) will likely be using all three  &lt;li&gt;People implementing custom test types (deriving from [Fact] and/or implementing ITestCommand) will likely be using IMethodInfo and IAttributeInfo&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If you're planning to do either of these activities, we'd love for feedback on these interfaces.&lt;/p&gt; &lt;p&gt;For existing implementations of these interfaces, there is a reflection wrapper inside of xunit.csproj (in Reflector.cs) and several Resharper wrappers in xunitext.runner.jetbrains.csproj (in TypeWrapper.cs, MethodWrapper.cs, and AttributeWrapper.cs).&lt;/p&gt; &lt;p&gt;If you have feedback on anything regarding the xUnit.net 1.0 RC1, and especially around these three interfaces, please use the &lt;a href="http://www.codeplex.com/xunit/Thread/List.aspx"&gt;xUnit.net forums&lt;/a&gt; for discussions. If you need to contact me directly, please use my &lt;a href="http://www.codeplex.com/UserAccount/UserProfile.aspx?UserName=BradWilson"&gt;CodePlex Contact Page&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Thanks, and happy extending!&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23748.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>xUnit.net Beta 2 Released</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/10/25/23642.aspx</link><pubDate>Thu, 25 Oct 2007 11:58:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/10/25/23642.aspx</guid><description>&lt;p&gt;We just pushed the button to ship &lt;a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=xunit&amp;amp;ReleaseId=7389"&gt;beta 2 of xUnit.net&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;There are a lot of breaking changes enumerated in &lt;a href="http://www.codeplex.com/xunit/Thread/View.aspx?ThreadId=16734"&gt;this forum post&lt;/a&gt;, so please read before upgrading. Most of the changes affect consumers of the xUnit SDK, but there are a few that affect users as well. The following issues and features were added or addresses in beta 2:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1392"&gt;Unexpected exception message does not show exception type&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1393"&gt;Incorrect output for timed out test&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1495"&gt;TD.NET + [RunWithNUnit] issue&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1519"&gt;Console runner throws exception when .config file is missing&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1545"&gt;Suggestion: Assert.Equal should work with IEquatable&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1557"&gt;cant create abstract test case&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1640"&gt;Load default configuration file if config file is not specified&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1742"&gt;Exception not serializable error&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1836"&gt;Rename [Property] to [Trait]&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1837"&gt;Rename [Test] to [Fact]&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1849"&gt;Pass MethodInfo to DataAttribute instead of Type&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1850"&gt;Allow test methods to return values&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1505"&gt;Support Resharper Test Runner&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1580"&gt;Support private test methods&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/WorkItem/View.aspx?WorkItemId=1843"&gt;Replace ITestFixture with IUseFixture&amp;lt;T&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a5872546-692d-4e05-88d7-cc4120842f4d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags:  		&lt;a href="http://technorati.com/tags/xUnit.net/" rel="tag"&gt;xUnit.net&lt;/a&gt; 		,  		&lt;a href="http://technorati.com/tags/Unit%20Testing/" rel="tag"&gt;Unit Testing&lt;/a&gt; 		&lt;/div&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23642.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>p&amp;amp;p Summit, Redmond WA, Nov 5-9</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/10/20/23600.aspx</link><pubDate>Sat, 20 Oct 2007 18:27:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/10/20/23600.aspx</guid><description>&lt;p&gt;It's hard to believe that another &lt;a href="http://www.pnpsummit.com/west2007.aspx"&gt;p&amp;amp;p Summit is almost here&lt;/a&gt;... the time has really flown by. This year I'll be co-presenting twice. The line-up of keynote talks looks positively awesome this year! (Despite Scott Hansleman's protestations to the contrary, he does belong in that group of intelligent and talented people. ;)&lt;/p&gt; &lt;p&gt;The first talk, "Yet another agile talk on agility", is one where &lt;a href="http://www.peterprovost.org/"&gt;Peter&lt;/a&gt; and I will answer questions from the audience about our experiences running agile teams, inside and outside of Microsoft. We run the talk just like an agile project, a technique that I first saw used by &lt;a href="http://www.agileprogrammer.com/oneagilecoder/"&gt;Brian Button&lt;/a&gt;. You start by creating an initial backlog (i.e., people ask questions and you write them down), then you go through an iterative stack-ranking and execution (i.e., answer them) process with time-boxed iterations (i.e., 5 minutes). It's pretty interesting process and never yields the same talk twice. It's also awesome in its ability to require no prepartion. ;)&lt;/p&gt; &lt;p&gt;The second talk, "Dependency Injection Frameworks", is one where &lt;a href="http://www.agileprogrammer.com/scottden/"&gt;Scott&lt;/a&gt; and I will talk about the work we've done evolving ObjectBuilder 2.0, as well as some sample containers that we have on the &lt;a href="http://www.codeplex.com/ObjectBuilder"&gt;ObjectBuilder CodePlex project space&lt;/a&gt;. A lot of the work there has come from real container needs in the wild, and some of the concerns about the complicated architecture of ObjectBuilder 1.0 have been addressed. In addition to our new containers and new architecture, we'll show off some of the new core features we've added, including a lightweight version of the CAB EventBroker and a method-interception system modeled after Enterprise Library's Policy Injection App Block.&lt;/p&gt; &lt;p&gt;I'm trying to make a commitment to be there all through the first 3 days so that people can sideline me both before and after the talks. Unfortunately, I won't be able to be there for the last 2 days. If you're going to be there, and want to talk about any of the projects I've got going on right now (&lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt;, ObjectBuilder, &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit.net&lt;/a&gt;, etc.) please don't hesitate to find me. You can also use the &lt;a href="http://www.agileprogrammer.com/dotnetguy/contact.aspx"&gt;Contact&lt;/a&gt; page here on the blog if you want to make sure I find time for you.&lt;/p&gt; &lt;p&gt;Hope to see you there!&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23600.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Going to ALT.NET</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/09/22/23422.aspx</link><pubDate>Sat, 22 Sep 2007 15:20:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/09/22/23422.aspx</guid><description>&lt;p&gt;After the xUnit.net announcement, a few people asked me whether I'd be at &lt;a href="http://www.altnetconf.com"&gt;ALT.NET&lt;/a&gt;. I had originally said "no", but plans have changed! I'll be there.&lt;/p&gt;
&lt;p&gt;I'm staying in the recommended hotel (Holiday Inn Northwest Plaza). I'm hoping there will be plenty of impromptu beer-fueled discussions after hours. :)&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23422.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Answering xUnit.net Questions</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/09/21/23415.aspx</link><pubDate>Fri, 21 Sep 2007 23:34:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/09/21/23415.aspx</guid><description>&lt;p&gt;I have a feeling we're going to be spending a few days answering all the inevitable questions that come up about &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit.net&lt;/a&gt;. :)&lt;/p&gt;
&lt;p&gt;A common theme of comments comes about the simplicity of the framework, some seeing this as a positive and some as a negative. This is definitely a design criteria for us. We're not trying to replicate every single attribute and assertion that the existing frameworks have, but rather use 5 years of experience to help us design something slightly different and new.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://weblogs.asp.net/rosherove/archive/2007/09/21/xunit-net-aims-to-be-the-next-nunit-but-it-s-too-soon.aspx"&gt;first set come from Roy Osherove&lt;/a&gt;. Here are his questions, along with our answers:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;There is no Assert.Fail (overlooked? I find this very usable in some instances)&lt;/b&gt; We didn't overlook this, actually. I find Assert.Fail is a crutch which implies that there is probably an assertion missing. Sometimes it's just the way the test is structured, and sometimes it's because Assert could use another assertion. We've seen Assert grow over time in many of the unit testing frameworks, so rather than letting Assert.Fail be a crutch, it's better to hear about what those missing methods on Assert might be. I've used Assert.Fail a lot in NUnit, but I haven't missed it once in xUnit.net.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;There is currently only a console runner. But there is already shipping TestDriven.NET support as part of the download! just run xunit.tdnet.installer.exe  that is next to the xunit.framework.dll &lt;/b&gt; This, too, was a conscious decision. Those are the two runners we use most (console for automated builds, and in-Visual-Studio test runs with TD.NET during development). We have two open issues on the &lt;a href="http://www.codeplex.com/xunit/WorkItem/List.aspx"&gt;xUnit.net issue tracker&lt;/a&gt; about adding a GUI runner and a Resharper runner, to see how many votes they'll get. We'd also encourage people to open bugs for other runners that might be useful.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Assert.Equals is deprecated and ou are instructed to use a generic version of Assert.Equal (without the 's') / I think this is a problem because generics make the Assert code longer to write and read while giving little contribution to the developer of the tests.&lt;/b&gt; Actually, the "Equals" method is part of Object, and it's not an assertion. We added the deprecated attribute to it so nobody would accidentally call it. Plus, the generic version of Equal does not actually require you to provide the type if it can be inferred, as I talked about in &lt;a href="http://www.agileprogrammer.com/dotnetguy/archive/2007/09/21/23414.aspx"&gt;my last post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;There is no built in Mocking framework&lt;/b&gt; There's really no reason to build in a mocking framework, as they shouldn't be tied to any specific unit testing framework. Myself, I prefer to hand write stubs (though I have used both RhinoMocks and NMock).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Assert.Equal on two strings, if it fails, does not add that nice little touch of visual that Nunit has that shwos you with an ascii arrow "----^" where the strings differ first&lt;/b&gt; Yep, we could add this. Write a feature request! :)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;There is no Setup and teardown&lt;/b&gt; This is one of those controversial decisions that will probably really get people talking. You can use constructors and IDisposable.Dispose() where you would've used SetUp and TearDown, so it's not that the functionality is completely gone. However, we do feel strongly against using it (and instead using the cross-cutting concerns system that we've added for extensibility purposes instead for common things like auto-rollback on database tests).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;There is still no solution for what happens if mutiple custom test attributes need to be run in a specific order.&lt;/b&gt; True, we don't address this, and we would prefer not to. The cross-cutting concerns attributes should operate independent of one another; if there is a dependency, then wrap up the combined behavior into a new, single attribute. The complexity involved with setting ordering is very unlikely to be worth the effort to understand and implement it.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;No Expected exception attribute. use try-catch or Assert.Throws, I find that less readable.&lt;/b&gt; Experience has really borne this one out for me. Consider, for example, your typical mock framework which requires you to call things like "mocks.VerifyAllExpectations()". When using ExpectedException, it's very easy to overlook the fact that this method never gets called, and your mocks aren't necessarily providing you with the safety you think they are. In addition, Assert.Throws allows you to inspect the exception object and run further asserts on it, something that ExpectedException does not do.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;From looking at the source code, it shoudl be able to also run NUnit tests (backwards compatible)&lt;/b&gt; We're working on separate Wiki content (and a blog post) which will address specifically how to migrate from NUnit to xUnit.net using the [RunWithNUnit] attribute.&lt;/p&gt;
&lt;p&gt;Lots of great feedback so far. Keep it coming, everybody!&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23415.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Implicit generics</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/09/21/23414.aspx</link><pubDate>Fri, 21 Sep 2007 22:45:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/09/21/23414.aspx</guid><description>&lt;P&gt;One of the very first questions we've seen regarding &lt;A href="http://www.codeplex.com/xunit"&gt;xUnit.net&lt;/A&gt;'s Assert.Equal&lt;&gt; syntax is regarding the necessity of the generics. I've seen people write things like:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;Assert.Equal&amp;lt;string&amp;gt;("foo", someValue);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;If someValue is a string (and we know "foo" is), the generic parameter is actually unnecessary. You can simply write:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P dir=ltr&gt;Assert.Equal("foo", someValue);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;The compiler can automatically determine the generic parameter type implicitly for you. In fact, if you run &lt;A href="http://www.jetbrains.com/resharper/"&gt;Resharper&lt;/A&gt;, it'll even help you out with the former line by marking the "&amp;lt;string&amp;gt;" bit in grey and offering to remove it for you, since it's redundant and unnecessary.&lt;/P&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/23414.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>