<ItemGroup> <TestAssembly Include="ClientBin\*Tests.dll" /> </ItemGroup> <Target Name="Test" DependsOnTargets="Build"> <NUnit Assemblies="@(TestAssembly)" WorkingDirectory="." ToolPath="C:\Program Files\NUnit 2.5.5\bin\net-2.0" /> </Target>
(Most examples don’t show the need to specify a ToolPath, but I have found I need it, perhaps because it isn’t in my Path?)
The trouble is, if the assemblies containing the unit tests have been build with the .NET 4 framework, you will get the following error:
C:\Program Files\NUnit 2.5.5\bin\net-2.0\nunit-console.exe /nologo ClientBin\ Nice.Inform.Client.Tests.dll ProcessModel: Default DomainUsage: Single Execution Runtime: net-2.0 Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'D:\TFS\Trial \Inform5\ClientBin\Client.Tests.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime a nd cannot be loaded. File name: 'D:\TFS\Trial\Inform5\ClientBin\Client.Tests.dll'
What is needed is to ensure that nunit-console.exe runs against the .NET 4 framework. The way I achieved this was to make a copy of the net-2.0 folder that comes with NUnit 2.5.5 and rename it to net-4.0 (n.b. make sure the lib folder comes along too as nunit-console.exe depends on its contents). Then, I edited the nunit-console.exe.config file to have the following contents (the key bit is to add the supportedRuntime setting):
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- Set the level for tracing NUnit itself --> <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug --> <system.diagnostics> <switches> <add name="NTrace" value="0" /> </switches> </system.diagnostics> <startup> <supportedRuntime version="v4.0"/> </startup> <runtime> <!-- We need this so test exceptions don't crash NUnit --> <legacyUnhandledExceptionPolicy enabled="1" /> <!-- Look for addins in the addins directory for now --> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="lib;addins"/> </assemblyBinding> </runtime> </configuration>
Now all that is needed is to update the ToolPath in the MSBuild script to point to the new location
<Target Name="Test" DependsOnTargets="Build"> <NUnit Assemblies="@(TestAssembly)" WorkingDirectory="." ToolPath="C:\Program Files\NUnit 2.5.5\bin\net-4.0" /> </Target>
I’d be interested in hearing if there is an easier way of solving this problem though, as I don’t really want to have to require all developers to manually perform these steps on their machine.