Handling exceptions in assembly-level setup methods in MbUnit
This post is more than 16 years old.
Posted at 07:00 on 04 May 2009
MbUnit allows you to run assembly-level setup and teardown methods as part of your unit tests using the AssemblyCleanUpAttribute:
[assembly: AssemblyCleanUp(typeof(AssemblyCleaner))]
public class AssemblyCleaner
{
[SetUp]
public static void SetUp()
{
// blah
}
[TearDown]
public static void TearDown()
{
// blah
}
}
This is very useful if you want to do something like restore your database to a known configuration, perhaps incorporating all your change scripts into your unit tests. Unfortunately, there is a little gotcha. If your SetUp() method throws an exception, none of your unit tests will run, but MbUnit will still report success.
For what it's worth, I think this is a bug, not a feature, but there is a way round it. Capture any exception, and create a unit test that re-throws it:
[assembly: AssemblyCleanUp(typeof(AssemblyCleaner))]
public class AssemblyCleaner
{
private static Exception setupException = null;
[SetUp]
public static void SetUp()
{
try {
// blah
}
catch (Exception ex) {
setupException = ex;
}
}
[TearDown]
public static void TearDown()
{
// blah
}
internal static void RethrowSetupException()
{
if (setupException != null) {
// Wrap the original exception to preserve its stack trace
throw new InvalidOperationException(
"An error occurred when setting up the tests",
setupException);
}
}
}
// You need to have your unit tests in a separate class.
// MbUnit doesn't like you including test fixtures
// in your assembly cleanup class.
[TestFixture]
public class AssemblyCleanerTest
{
[Test]
public void ReportSetupException()
{
AssemblyCleaner.RethrowSetupException()
}
}