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

我正在使用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);
}

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

最佳答案

Is there a way of only setting up the test data once for each run of InlineData? …if this is the only test in the class that uses that data.

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

否则,如果重新使用思想,则可以在创建一个测试上下文时使用Collection Fixture,然后在许多不同的测试类之间共享,一旦完成所有测试上下文,就会清除它.

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

所以你有两个其他选项可以提供一种方法来不付出创建和破坏上下文的开销.

参考

> Shared Context between Tests

最后的想法

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

点赞