NUnit Test Actions for Great Good
Lots of c# unit tests I see build up a set of abstract base classes to allow for things like setting up common environments and handling common startup and teardown tasks. This is never a good approach, in my opinion, and can lead to some difficult workarounds due to the high level of coupling this implies. NUnit has a better approach by allowing a text fixture or method to be decorated with a custom attribute that allows code to be run before and/or after all the tests in that test fixture or just the one affected test method.
using NUnit.Framework;
[TestFixture]
[CommonTestHousekeeping]
public class ExampleTest
{
[Test]
public void Example_Must_Do_Housekeeping_First()
{
...
}
}
using NUnit.Framework;
...
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true)]
public class CommonTestHousekeepingAttribute : Attribute, ITestAction
{
public ActionTargets Targets
{
get { return ActionTargets.Default; }
}
public void BeforeTest(TestDetails testDetails)
{
// do stuff here
// ...
if (NotAbleToDoTheThingIWasSupposedToDo)
{
// report an error back to the NUnit framework
throw new ApplicationException("Could not do the thing");
}
}
public void AfterTest(TestDetails testDetails)
{
// do stuff here
// ...
}
}
Now rather than having all that coupling to a base class, if you decide your test no longer needs the housekeeping, you remove the attribute and nothing else changes.