Handling exceptions in assembly-level setup methods in MbUnit
This post is more than 15 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() } }