Frage

Wir haben mit NUnit & Visual Studio C # .NET-Code für eine Weile jetzt zu schreiben. Testen Ausnahmen wurde im Stil von

getan

alte Syntax:

[Test]
[ExpectException(typeof(ExceptionType))] 
public void TestExceptionType()
{

}

Jetzt NUnit hat 2.5.2 freigegeben Version, die Assert.Throws( Type expectedExceptionType, TestDelegate code ); eingeführt Dies macht Ausnahme eine ganze Menge mehr flexibel zu testen. Unsere Ausnahme-Tests sehen nun wie folgt aus:

neue Syntax:

[Test]
public void TestWithNullBufferArgument()
{
   ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() => _testInstance.TestFunction(null));

   // now you can examine the exception and it's properties
   Assert.AreEqual(ex.Message, "Argument was null");
}

Unser Problem ist, dass, wenn Assert.Throws von Visual Studio verwendet wird, wird ein Fenster hustet eine nicht behandelte Ausnahme zeigt, wenn NUnit (entweder Konsole oder GUI Runner) verwendet wird, um das Programm zu debuggen.

Um dies zu verdeutlichen: wir haben das VS-Projekt enthält die Unit-Tests eingestellt nunit-x86.exe laufen beim Debuggen. (Siehe Projekteigenschaften, Registerkarte Debuggen, starten Aktion gesetzt nunit-x86.exe laufen)

Dies stoppt NUnit aus den Tests fortfahren. Es ist möglich, Debugging / Einheit fortzusetzen Prüfung durch Drücken der Taste F5, aber dies ist keine praktikable Lösung.

Gibt es eine Möglichkeit, dies zu vermeiden? Einlochen try ... catch-Block um die Assert.Throws tut nichts, da die Ausnahme im Code Delegierten geschieht.

ich hoffe, jemand etwas Licht auf diesem verschütten kann.

War es hilfreich?

Lösung

Das Problem selbst erscheint, weil die meisten wahrscheinlich haben Sie die Option aktivieren Just My-Code eingeschaltet (Tools-> Optionen-> Debugging-> Allgemein-> Aktivieren Just My-Code).

„Wenn diese Funktion aktiviert ist, zeigt der Debugger und Schritte in Benutzercode (“ My-Code „) nur, ignoriert Systemcode und anderen Code, der optimiert ist oder nicht über Debug-Symbole“ (siehe „ Allgemein, Debugging, Dialogfeld Optionen ")

Normalerweise haben Sie eine Release-Version von nunit.framework.dll, die keine entsprechenden nunit.framework.pdb Datei hat.

So gibt es 2 Möglichkeiten:

  1. Aus "Just My-Code" -Funktion

  2. Download Quellen nunit (von http://www.nunit.org /index.php?p=download ), so dass sie im Debug-Modus bauen, alle NUnit.Framework setzen. * (dll, pDB, xml) in lib oder anderes Verzeichnis in Ihrer Lösung und Referenz dass nunit.framework.dll in Ihrem Testprojekt.

Hope, das hilft.

Andere Tipps

Das gleiche Problem hat mich geärgert auch für einige Zeit, ich ein paar Tests gemacht und fanden die folgende:

Wenn eine Bibliothek (nunit in diesem Fall) mit Debug-Informationen auf ‚none‘ kompiliert wird, dann, wenn Konstrukt ähnlich einen unten ausgeführt wird withing die Bibliothek und die Delegierten Code löst eine Ausnahme, dann stoppt VS etwa Ausnahme nicht beschweren behandelt durch den Benutzercode.

In der Bibliothek Code:

public static Exception Throws(TestDelegate code, string message)
{
    Exception caughtException = null;

    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }        

    return caughtException;
}

Client-Code:

private void btnTest_Click(object sender, EventArgs e)
{
  var ex = MyAssert.Throws(() => { throw new Exception(); }, "");    
}

Einstellung Debug-Informationen eines Bibliotheksprojekt jede andere Option außer ‚none‘ löst das Problem heißt Debugger stoppt nicht mehr auf diesen irgendwie „nicht behandelte“ Ausnahmen. Getestet habe ich es mit nunit und meine eigene Hand gerollt Bibliothek mit dem obigen Code (nahm einen Ausschnitt aus nunit Würfen Methode). Ich nehme an, es ist ein Merkmal oder ein „Feature“ von VS.

Es lässt uns nicht so viele Möglichkeiten:

  1. Filter Ausnahme wie zuvor vorgeschlagen

  2. Recompile nunit.framework.dll für den lokalen Gebrauch, die lästigen Anschläge

  3. zu vermeiden

Weitere Möglichkeiten, um Kontakt entweder MS oder NUnit Teams sein könnten oder beide und sie bitten, Problem zu untersuchen / klären und NUnit mit minimalem Niveau kompilieren Informationen zur Austestung respectevily.

Edit:

Gefunden eine weitere Option.

  1. In meinem Fall ‚Unterdrückt JIT-Optimierung auf Modullast‘ unchecking tut auch den Trick, auch wenn Bibliotheken ohne Debug-Informationen kompiliert. Allerdings funktioniert es nur, wenn Projekt in Release-Konfiguration ausgeführt wird.

Ich glaube, Sie durch die Behauptung NUnit geblendet werden. Sie könnten das gleiche mit einem einfachen try / catch erreichen.

try
{
  _testInstance.TestFunction(null);
  Assert.Fail("The method should have thrown...");
}catch{}

Jetzt haben Sie alles, was Sie brauchen. Sie scheitern, wenn die Ausnahme nicht ausgelöst wird, und Ihr regelmäßiger Code kann Ausnahmen behandeln, wie erwartet.

Könnte es durch Deaktivieren der Ausnahme erreichbar sein. Öffnen Sie Debug / Ausnahmen Menü und suchen Sie Ihren Ausnahme.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top