July 6, 2006 spout

Struggling with NUnit (2.2)

I had a very unpleasant afternoon trying to get NUnit working, so I thought I’d share my troubles and my solutions (such as they are). A search revealed a lot of folks with the same troubles, but precious few explanations or solutions. The NUnit Quick Start documentation does a wonderful job telling you how to write a simple TestFixture class with one or more Test methods (and even an optional SetUp method). However, as far as I could tell, there wasn’t any part of that tutorial that said “Hey! Add a reference to nunit.core.dll’ as well as nunit.framework.dll’ to your project or neither nunit-gui nor nunit-console will work;” you’ll get a System.IO.FileNotFoundException when you don’t have nunit.core.dll (the Exceptions Details menu item doesn’t help):

Also, when you start up nunit-console, you better darn well be in the current working directory of the test assembly as well as nunit.core or you’re going to get the same message in the console. Likewise, if you start nunit-gui. Further, if you just run nunit-gui, create a new project and then add an assembly, you better have known to save the .nunit project file in the same directory as the assemblies you add, or you’ll be getting the same message again.

And, as if that weren’t enough, you’ll get this message again if you add nunit integration as an external tool to VS05 (via the Tools | External Tools menu item) using the instructions in the docs. The docs say to use $(TargetPath) and $(TargetDir), but those variables expand to the obj directory on my machine (although that seems wrong to me), not the bin directory, and the obj directory doesn’t contain the referenced assemblies. I never was able to get a VS05 external NUnit tool to work.

Luckily, it’s very cool that nunit-gui doesn’t keep test assemblies locked and notices when an assembly has changed from underneath it, so that once I do get it started with the appropriate working directory, it works nicely.

As it turned out, there were a lot of ways to get that FileNotFoundException message and I’m pretty sure I found them all before finding any ways to actually make nunit work. None of these things are NUnit’s fault it’s damn hard to do dynamic assembly loading in .NET but it’s still on you to make sure NUnit is configured properly.

Finally, the tutorial shows but doesn’t say that you better make your test methods public. Since NUnit uses Reflection, it doesn’t need the classes or the methods to be public, but I guess they decided that was an interesting knob to let the developer turn. I’d have preferred to let the default permissions work (internal) to save myself typing, but that’s just a nit.