TestFixture SetUp and TearDown
I have finally got round to trying NUnit 2.1 with NUnit Add-In. I am relieved to report that it works out of the box with the current version of NUnit Add-In (the one you’re probably using). All you have to do is start using the ‘NUnit.Framework’ assembly from the 2.1 release. If you’re interested to see the code that binds to pretty much any version of NUnit, you can find it here. There’s obviously some reflection in there, but the more interesting bit is the RealProxy. I had to use that to deal with the evolving test listener interface. The reason I started using 2.1 was for the TestFixtureSetUp/TearDown attributes. I didn’t particularly want to be firing up new instance of Visual Studio for every little add-in unit test. With the new attributes I can do the set-up and the start of the test run and tear-down at the end. This goes for whether I’m running an individual test or all tests in an assembly. Here is an example of how to use the new attributes, plus some other stuff for fun.. ;o)
namespace Tests
{
using System;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
using NUnit.Framework;
using EnvDTE;
[TestFixture]
public class TestVisualStudio
{
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
_dte = new DTEClass();
_dte.MainWindow.Top = 50;
_dte.MainWindow.Left = 50;
_dte.MainWindow.Height = 200;
_dte.MainWindow.Width = 1024;
}
private DTE _dte;
[TestFixtureTearDown]
public void TestFixtureTearDown()
{
_dte.Quit();
Marshal.ReleaseComObject(_dte);
}
[Test]
public void TestNUnitAddInEscapes()
{
Debug.WriteLine(_dte, "_com");
Debug.WriteLine("=====================");
Debug.WriteLine(_dte, "_verbose");
}
[Test]
public void TestShowMeTheCode()
{
_dte.MainWindow.Visible = true;
System.Diagnostics.StackFrame frame = new System.Diagnostics.StackFrame(0, true);
string fileName = frame.GetFileName();
int lineNumber = frame.GetFileLineNumber() - 1; // make it zero based
string[] lines = new StreamReader(fileName).ReadToEnd().Split(new char[] {'\n'});
string code = lines[lineNumber];
Debug.WriteLine(code);
_dte.StatusBar.Text = code;
System.Threading.Thread.Sleep(5000);
_dte.MainWindow.Visible = false;
}
}
}