2017-02-15 3 views
0

Also das ist ein bisschen eine seltsame Einrichtung. Ich verschiebe unsere Tests von MSTest (Visual Studio Unit Tests) auf NUnit 3+.Catch NUnit AssertionException ohne fehlgeschlagenen Test in C#

In meinem ursprünglichen Testframework fügte ich ein Testprogramm namens Verify hinzu, in dem bestätigt wurde, aber die Ausnahme unterdrückt/ignoriert wurde. Wir warten einfach bis zum Ende des Tests, um festzustellen, ob Fehler aufgetreten sind.

public class Verify { 
    public static int NumExceptions = 0; 

    public static void AreEqual(int expected, int actual) { 
     try { 
      Assert.AreEqual(expected, actual); 
     } catch (AssertFailedException) { 
      NumExceptions++; 
     } 
    } 

    public static void AssertNoFailures() { 
     Assert.AreEqual(0, _numExceptions); 
    } 
} 

der Test-Code für diese So könnte sein:

[TestMethod] 
public void VerifyPassesCorrectly() { 
    int x = 2; 
    int y = 3; 

    Verify.AreEqual(3, y); 
    Verify.AreEqual(2, x); 
    Verify.AreEqual(5, x + y); 

    Verify.AssertNoFailures(); 
} 

[TestMethod] 
[ExpectedException(typeof(AssertFailedException))] 
public void VerifyCountsFailuresCorrectly() { 
    Verify.AreEqual(3, 2); 
    Assert.AreEqual(1, Verify.NumExceptions); 
} 

Beide Tests bestehen, obwohl ein AssertFailedException

geworfen Als ich NUnit bewegen, scheint es, wie es besser Möglichkeiten dazu (Warn, MultipleAssert). Schließlich werden wir unsere neuen Tests bauen, um diese Verbesserungen zu nutzen. In der Zwischenzeit muss ich jedoch für bestehende Tests eine Abwärtskompatibilität bereitstellen.

Mein ursprünglicher Plan war einfach Bibliotheken auszulagern und den Ausnahmetyp ändern:

public static void AreEqual(int expected, int actual) { 
    try { 
     Assert.AreEqual(expected, actual); 
    } catch (AssertionException) { 
     NumExceptions++; 
    } 
} 

Dies erfordert keine wesentlichen Änderungen an der bestehenden Test-Code, noch wirklich an die Struktur der Klasse prüfen. Wenn ich solche Tests jedoch innerhalb von Visual Studio mit NUnit Adapter ausfühle, wird dieser zweite Test wie erwartet ausgeführt (keine Ausnahme), aber der Test schlägt fehl, und es werden die Ausnahmen aufgelistet, die während der Verify-Schritte gefunden wurden.

Die breitere Lösung besteht darin, die Verify-Klasse einfach zu entfernen, da sie dank NUnit nicht mehr benötigt wird. Aber bis das passiert, gibt es eine Möglichkeit, die NUnit-API in Verify zu verwenden, so dass die Assertions in der Verify-Klasse nicht von NUnit "gespeichert" werden und zum Fehlschlagen der Tests verwendet werden?

Antwort

2

Sie werden NUnit nicht sagen können, dass Asserts einen Test nicht fehlschlagen lassen sollte. Also, was Sie können tun, ist ändern Sie Ihre AreEqual-Methode, nur um den Gleichheitstest selbst zu tun.

if (expected != actual) { 
    NumExceptions++; 
} 

Dies scheint die einfachste Lösung zu sein.

Die zweite Option ist genau das, was NUnit in seinen Assert-Anweisungen macht. Wenn Sie tun möchten, dass (aber ohne den Test fehlgeschlagen natürlich zu verursachen). Der Code würde wie folgt aussehen:

public static void AreEqual(int expected, int actual) { 
    var equalToConstraint = Is.EqualTo(expected); 
    var result = equalToConstraint.ApplyTo(actual); 
    if (!result.IsSuccess) { 
     NumExceptions++; 
    } 
} 

Die Is Klasse Teil NUnit ist, aber es ist öffentlich und man könnte es so benutzen, wenn Sie wollen.

+0

Okay, das ist mir während dieses Prozesses aufgefallen. Ich hatte gehofft, dass es einen "besseren" Weg geben könnte. Vielen Dank! –

Verwandte Themen