Frage

Ist es möglich, xUnit.net zu sagen, alle zum Beispiel auszuführen Assert.True() in einem Testverfahren? Im Grunde genommen in einigen unserer Anwendung / Testfälle alle Behauptungen gehören logisch zu einem und denselben ‚Umfang‘ von Tests und ich habe zum Beispiel so etwas wie folgt aus:

    [Fact(DisplayName = "Tr-MissImpl")]
    public void MissingImplementationTest()
    {
        // parse export.xml file
        var exportXml = Libraries.Utilities.XML.GenericClassDeserializer.DeserializeXmlFile<Libraries.MedTrace.ExportXml>(
                ExportXmlFile);

        // compare parsed results with expected ones
        Assert.True(exportXml.ContainsRequirementKeyWithError("PERS_154163", "E0032A"));
        Assert.True(exportXml.ContainsRequirementKeyWithError("PERS_155763", "E0032A"));
        Assert.True(exportXml.ContainsRequirementKeyWithError("PERS_155931", "E0032A"));
        Assert.True(exportXml.ContainsRequirementKeyWithError("PERS_157145", "E0032A"));

        Assert.True(exportXml.ContainsRequirementKeyWithError("s_sw_ers_req_A", "E0032A"));
        Assert.True(exportXml.ContainsRequirementKeyWithError("s_sw_ers_req_C", "E0032A"));
        Assert.True(exportXml.ContainsRequirementKeyWithError("s_sw_ers_req_D", "E0032A"));       
    }

Nun, wenn z.B. die erste Assert.True(...) fehlschlägt, werden die anderen nicht ausgeführt / geprüft. Ich möchte lieber nicht diese sieben Assertions zerfallen in verschiedene Methoden, da diese wirklich logisch zusammen gehören (der TC nur ‚bestanden‘ ist vollständig, wenn alle sieben sind vorbei alle zusammen).

War es hilfreich?

Lösung

Der ganze Sinn der AAA ist zu zielen jedes Stück so weit wie möglich zu vereinfachen und halten es fokussierte, damit die Leser schnell die Tests verstehen und die Ursache von Fehlern leicht zu isolieren.

Sie haben 7 verschiedene Facts hier, die zusammen eine Theory umfassen. So sollten Sie eine [Theory] mit 7 Sätzen von [InlineData] zu schaffen, die Erwartungen entspricht. Siehe http://blog.benhall.me.uk /2008/01/introduction-to-xunitnet-extensions.html für ein Beispiel.

Wenn die erneute Ausführung des Vereinbaren / Act ein Problem ist, dann sollten Sie zu machen, dass die ‚Leuchte‘ (in xUnit-Test parlance Patterns) durch, dass im Konstruktor Ihrer Testklasse zu tun.

public class WithGenericClassDeserializer
{
    var exportXml;

    public WithGenericClassDeserializer()
    {
        // Or move this into the GivenExportXmlFile_ExpectedValueAtKeyShouldMatch
        exportXml = Libraries.Utilities.XML.GenericClassDeserializer.DeserializeXmlFile<Libraries.MedTrace.ExportXml>( ExportXmlFile );
    }

    [Theory( DisplayName = "Tr-MissImpl" )]
    [InlineData( "PERS_154163", "E0032A" )]
    [InlineData( "PERS_155763", "E0032A" )]
    [InlineData( "PERS_155931", "E0032A" )]
    [InlineData( "PERS_157145", "E0032A" )]
    [InlineData( "s_sw_ers_req_A", "E0032A" )]
    [InlineData( "s_sw_ers_req_C", "E0032A" )]
    [InlineData( "s_sw_ers_req_D", "E0032A" )]
    public void GivenExportXmlFile_ExpectedValueAtKeyShouldMatch( string key, string value )
    {
        Assert.True( exportXml.ContainsRequirementKeyWithError( key, value ) );
    }
}

Andere Tipps

Ja, Sie können, aber Sie müssen zusätzlichen Code zu Ihrem Test hinzufügen. Jede Assert-Anweisung in xUnit wird eine Ausnahme ausgelöst, wenn die Assertion fehlschlägt. So im Fall von Assert.True wirft es einen TrueException. Also, was Sie können, ist tun etwas entlang der Linien von:

    [Fact]
    public void MultipleAssertTest()
    {
        bool passesValidation = true;

        passesValidation = PassesAssert(true == true);
        passesValidation = PassesAssert(false == true);
        passesValidation = PassesAssert(5 == 1);

        Assert.True(passesValidation);

    }

    private bool PassesAssert(bool expression)
    {
        try
        {
            Assert.True(expression);
            return true;
        }
        catch
        {
            return false;
        }
    }

Damit können Sie alle laufen Ihre behauptet und vollständig Ihren Test zu machen. Allerdings ist es nicht sehr hilfreich, wie Sie wissen nicht, was Assertion fehlschlägt. Was wäre besser, unten ist, so dass Sie tatsächlich Ergebnisse aus Ihrem Test erhalten können damit Sie wissen, welche Elemente nicht.

       private StringBuilder resultMsg;
    [Fact]
    public void MultipleAssertTest()
    {
        bool passesValidation = true;
        resultMsg = new StringBuilder();

        passesValidation = PassesAssert(true == true, "True True test");
        passesValidation = PassesAssert(false == true, "False True test");
        passesValidation = PassesAssert(5 == 1, "5==1 Test");

        Assert.True(passesValidation, resultMsg.ToString());

    }

    private bool PassesAssert(bool expression, string message)
    {
        try
        {
            Assert.True(expression, message);
            return true;
        }
        catch (AssertException ex)
        {
            resultMsg.Append(ex.UserMessage);
            resultMsg.Append(Environment.NewLine);
            return false;
        }
    }

Natürlich erfordert dies ein wenig mehr Arbeit, aber es erlaubt Ihnen, alle zu blockieren Ihre zusammen Asserts. Sie können auf diese Weise alle Ihre Test Assert Methoden wickeln. So könnte man sagen, dass Sie xUnit erweitern eine nicht versiegende Assert Prozess.

Hope, das hilft.

EDIT:. Gemäß den Kommentaren, damit dies funktioniert müßte die & Operator als die nachfolgenden Anrufe verwenden, würde den Wert überschreibt

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