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

时间:2015-12-03 23:31:25

标签: 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);
}

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

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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

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

<强>参考

最后的想法

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