Xunit:在一种测试方法中执行所有'断言'?

Jör*_*ann 2 .net xunit.net assertions arrange-act-assert

有可能告诉xUnit.net Assert.True()在一个测试方法中执行所有操作吗?基本上在我们的一些use/testcases中,所有断言在逻辑上都属于同一个"范围"的测试,我有这样的东西:

    [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"));       
    }
Run Code Online (Sandbox Code Playgroud)

现在,如果第一个Assert.True(...)失败,则不执行/检查其他的.我宁愿不将这七个断言分解为单独的方法,因为它们确实在逻辑上属于一起(如果所有七个都通过一起,则TC仅被'完全传递'.

Rub*_*ink 8

AAA的重点是尽可能地简化每个部分并使其集中,因此读者可以快速理解测试并轻松地找出故障原因.

Fact这里有7个不同的s,它们共同组成一个Theory.所以你应该创建一套代表期望的[Theory]7套[InlineData].有关示例,请参见http://blog.benhall.me.uk/2008/01/introduction-to-xunitnet-extensions.html.

如果重新执行安排/法案是一个问题,那么你应该通过在测试类的构造函数中执行此操作来制作"夹具"(在xUnit测试模式中使用).

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 ) );
    }
}
Run Code Online (Sandbox Code Playgroud)