Testdriven.net ad hoc tests and XNA

By Henning Degn (mail me)

Updated 2007-05-17 21:51

 

Files: AssemblyUtilities.zip

 

This article is about issues with Testdriven.net and XNA. As such, it assumes you already have both Testdriven.net and the XNA Framework installed.

 

Update: A previous solution posted here has been removed, as a newer and a lot easier method has come forth. I’m not even going to let you know the previous solution! It was that bad! :)

 

Credits for this workaround should go to Jamie Cansdale at Testdriven.NET (WOW great support!) for troubleshooting this issue and designing a helper class.

 

Note: Testdriven.net 2.0 RTM didn't include support for Visual Studio Express editions. However, all betas of Testdriven.net since 2.5 works fine in XNA game studio express

 

Some tests in XNA cannot be done dynamically. These tests usually require visual inspection and therefore need to be run manually. Using Testdriven.net you can run test scenarios, simply using an ad hoc test of a function containing the test. Simple. Effective. No need to modify the main method to run these functions.

 

However, when using any XNA content I have stumbled on the following error:

Microsoft.Xna.Framework.Content.ContentLoadException: Error loading "Content\myTexture". File not found. ---> System.IO.DirectoryNotFoundException: Could not find a part of the path  'C:\WINDOWS\assembly\GAC_32\Microsoft.Xna.Framework\1.0.0.0__6d5c3888ef60e27d\Content\myTexture.xnb'

 

The reason being that (naturally) I didn’t put my content inside the GAC (Global Assembly Cache)! The ContentManager is using the codebase of the assembly who’s main method called it as its root. Since Testdriven.net ad hoc tests can’t supply this to the content loader, it default to is own location… inside the GAC (a pretty poor design decision, content will NEVER be located here).

Nothing can be done about this, unless someone convinces the XNA team to use ‘AppDomain.CurrentDomain.BaseDirectory’ instead. :-)

 

Workaround

A Workaround do exist however!

A simple utility class can be used to manually set the Entry Assembly, allowing XNA content loading to continue correctly.

 

Step 1.

Download AssemblyUtilities.zip and unpack into your project and add it to your solution.

 

Step 2.

For every ad hoc test you wish to run, use the command:

Testdriven.NET.AssemblyUtilities.SetEntryAssembly();

 

This needs to be called before content loading, such as in the first line.

 

An example of an ad hoc test can be seen here:

public static void myAdHocTest()

{

Testdriven.NET.AssemblyUtilities.SetEntryAssembly();

//Do your testing here

}

 

Step 3.

Run the ad hoc tests like normal, by putting the caret in the test, right-click and choose “run test(s)”.

 

Conclusion

Comments? Send me a mail!