Assert.Fail und Assert.Pass oder gleichwertig können nicht gefunden werden

72

Ich habe diese in NUnit verwendet und sie sind wirklich nützlich. Irgendeine Idee, wie man so etwas macht?

BEARBEITEN, CODE-BEISPIEL:

        bool condition = false;//would be nice not to have this
        observable.Subscribe(_ =>
        {
            if (real test)
                condition= true;//Assert.Pass()
        });
        StartObservable();
        Assert.True(condition);//Assert.Fail()      
naeron84
quelle

Antworten:

101

Die Dokumentation enthält eine Vergleichstabelle mit folgenden Angaben :

Fail - xUnit.net Alternative: Assert.True(false, "message")

(Es wird nicht angezeigt Assert.Pass, und ich habe das selbst nie verwendet, aber ich vermute, dass die Alternative darin besteht, nur vom Test zurückzukehren. Das hilft natürlich nicht, wenn Sie es in einen verschachtelten Methodenaufruf werfen möchten. Mein Verdacht ist, dass es in NUnit nicht sehr häufig verwendet wird, daher fehlt es in der Vergleichstabelle.)

Jon Skeet
quelle
Siehe das Codebeispiel (Bearbeiten). Es ist eine Option, einfach zurückzukehren, oder ich könnte goto verwenden ...: D
naeron84
@ naeron84: Um ehrlich zu sein, würde ich nur mit der Version leben, die Sie haben. Wenn Sie dies für mehrere Bedingungen mit Observablen testen müssen, können Sie alles ganz einfach in eine Hilfsmethode einbinden, die einfacher zu verwenden wäre als die Version mit Assert.Fail/Pass.
Jon Skeet
13
IMO ist es ein bisschen Unsinn, dass xUnit kein Fail () hat. Wenn Sie Assert.True () verwenden, erhalten Sie immer noch eine Ausgabe wie "Expected: True Actual: False", was etwas irreführend ist.
Bytedev
1
@ Nashwan: Einverstanden. Es gibt einige NUnit-Funktionen, die ich in xUnit immer noch vermisse. Na ja :(
Jon Skeet
1
@bytedev throw new Xunit.Sdk.XunitException(message);loswerden Expected: True Actual: False. Schauen Sie sich meine Antwort für weitere Details an.
Nik
52

Eine Alternative zu Assert.Fail("messsage")den von xUnit-Dokumenten vorgeschlagenen

xUnit.net-Alternative: Assert.True (false, "message")

hat einen Nachteil - seine Ausgabe ist

message

Expected: True
Actual:   False

Loswerden

Expected: True
Actual:   False

nenne stattdessen nicht Assert.True(false, "message")werfen Xunit.Sdk.XunitException.
Erstellen Sie beispielsweise eine ähnliche Hilfsmethode:

public static class MyAssert
{
    public static void Fail(string message)
        => throw new Xunit.Sdk.XunitException(message);
}
Nik
quelle
8
Diese seltenen Fälle, in denen jemand besser antwortet als Jon
Skeets
Ja, aber es ist eine Schande, dass wir eine Assert.FailProblemumgehung durchführen müssen, um die Funktionalität in mstest nachzuahmen.
meJustAndrew
6

Lösen Sie einfach eine Ausnahme aus, um beide Anforderungen zu erfüllen (Verlassen einer verschachtelten Schleife und eine Alternative zur fehlenden Assert.Fail-Methode). Das einzige Problem ist, dass es keine anständige Basisausnahme (z. B. TestException) gibt, die verwendet werden kann, um Warnungen vor der Verwendung der Basisausnahmeklasse zu vermeiden. Daher ist wahrscheinlich eine gezieltere Ausnahme wie eine InvalidOperationException eine gute Wahl.

Tony Wall
quelle
2
Zumindest in xunit 2.3.1 gibt es eine geeignete Ausnahme - Xunit.Sdk.XunitException. Wahrscheinlich ist es auch in früheren Versionen verfügbar - ich habe es nicht überprüft. Schauen Sie sich meine Antwort für weitere Details an.
Nik