Jul 242013
 

Ich bin gestern bei einer “0815” Fakes Framework Demo auf eine Exception gestoßen. Der Code macht nix besonderes und unterdrückt einfach bei einem MessageBox.Show() Aufruf die Anzeige der MessageBox und simuliert das der Benutzer auf Ok geklickt hat:

fakesdebugging_fakemessagebox

Soweit so gut. Funktioniert auch. Lässt sich nur nicht debuggen:

fakesdebugging_unittestisolationexception

Beim Aufruf ShimContext.Create() erhalte ich eine “UnitTestIsolationException”. Der Fehlertext ist eine große Hilfe, demnach würde ich wohl heute noch mein Visual Studio neu starten.

Am Ende war die Lösung einfach. Leider wurde das Projekt von Visual Studio 2010 auf 2012 migriert und enthielt noch eine *.testsettings Datei. Die Unit Tests wurden also mit diesen Einstellungen ausgeführt.

fakesdebugging_testsettings

Visual Studio kann mit den *.testsettings von 2010 noch umgehen und in manchen Fällen sind diese auch noch notwendig. Zum Beispiel wenn man Tests aus Visual Studio heraus Remote ausführen möchte oder für Web Performance und Last Tests. (siehe http://msdn.microsoft.com/de-de/library/jj635153.aspx)

In VS 2012 wurden bekanntlich die *.runsettings eingeführt. Damit laufen nicht nur MSTest Unit Tests sondern auch NUnit, XUnit usw. Die runsettings sind allerdings etwas unhandlich weil es kein UI zum editieren gibt und man die Einstellungen im XML vornehmen muss.

Nach umschalten auf eine *.runsettings Datei lassen sich die Tests welche MS Fakes enthalten wieder debuggen.

fakesdebugging_runsettings

Aug 172012
 

Will man in einem Unit Test 2 Listen z.B. vom Typ List<T> vergleichen muss man sicherstellen das die Klassen in der Liste auch die Equals Methode richtig implementieren. Beispiel: Dieser Code funktioniert nur wenn die Klasse DataItem die Equals Methode überschreibt.

[TestMethod]
public void GetDataList_TestWithEquals()
{
    Class1 c = new Class1();

    var expectedList = new List<DataItem>() {new DataItem { Name = "Test"}};

    CollectionAssert.AreEqual(expectedList, c.GetDataList());
}

Alternativ kann man bei CollectionAssert.AreEqual auch eine Klasse angeben welche das Interface IComparer implementiert:

[TestMethod]
public void GetDataList_TestWithIComparer()
{
    Class1 c = new Class1();

    var expectedList = new List<DataItem>() {new DataItem { Name = "Test"}};

    CollectionAssert.AreEqual(expectedList, c.GetDataList(), new DataItemComparer());
}

Hier das Sample als kleines VS2012 Projekt: Download