对 xUnit Theory 的多次运行使用相同的测试数据

Ste*_*eve 5 unit-testing xunit xunit.net

我正在使用 xUnit 对我的应用程序进行单元测试,并且目前正在设置一个测试以使用该[Theory]属性来测试几个不同的数据输入。

为此,我需要在我之前模拟的数据上下文中创建测试数据。这有效,但是当我在测试本身中添加数据时,每次运行最终都会再次添加相同的数据。

我目前的测试:

[Theory]
[InlineData(null, 2)]
[InlineData("en-AU", 1)]
public void Test1(string term, int expectedCount)
{
    Fixture.DbContext.Culture.Add(new Culture { Name = "English (Australia)", CultureCode = "en-AU", NativeName = "English (Australia)"});
    Fixture.DbContext.Culture.Add(new Culture { Name = "English (United States)", CultureCode = "en-US", NativeName = "English (United States)" });
    Fixture.DbContext.Culture.Add(new Culture { Name = "English", CultureCode = "en", NativeName = "English", NeutralCultureFlag = true });

    var result = controller.GetRegions(term);

    Assert.IsType(typeof (JsonResult), result);
    var jsonResult = (JsonResult)result;

    Assert.Equal(expectedCount, jsonResult.Data);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法只为每次运行设置一次测试数据InlineData?我知道我可以把它放在测试类的构造函数中,但我不想这样做,因为如果这是类中唯一使用该数据的测试,这似乎没有必要。

Ωme*_*Man 3

有没有办法每次运行 InlineData 时只设置一次测试数据?...如果这是使用该数据的类中唯一的测试。

如果我正确理解了这种情况,我相信所寻求的是使用 XUnit 的类夹具(使用IClassFixture<>在测试类上实现的),它可以在需要时提供在单个类的测试之间共享的单个测试上下文的逻辑。然后在完成所有这些本地测试后进行清理。

否则,如果考虑重用,则当要创建一个测试上下文一次,然后在许多不同的测试类之间共享时,可以使用集合夹具,并且一旦完成所有操作,它将被清理。

但是您提到可以使用构造函数/处置,这将为该类的每个测试创建和销毁一个新的上下文;正如您所提到的,当只有一个测试使用它时,这是一种浪费。

因此,您还有另外两个选择,它们可以提供一种无需支付不必要的创建和销毁上下文的开销的方法。


参考


最后的想法

坦率地说,如果这是一个如此独特的测试,为什么它必须有一套理论呢?只需将其作为单独的测试即可。