多次运行 xUnit Theory 使用相同的测试数据
Use the same test data for multiple runs of 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
的每个运行设置一次测试数据?我知道我可以把它放在测试 class 的构造函数中,但我不想这样做,因为如果这是 class 中唯一使用该数据的测试,这似乎没有必要。
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<>
在测试 class 上实现),它可以提供以下逻辑单个测试上下文 在测试中共享 对于单个 class 在需要的地方。然后在完成所有这些本地测试后清理。
否则,如果想法被重复使用,可以使用 Collection Fixture 当一个测试上下文被创建一次然后在许多不同的测试之间共享 classes 并且一旦完成, 然后会被清理掉。
但是您提到可以使用 constructor/dispose,这将为 class 上的每个测试 创建和销毁一个新的上下文 ;正如您所提到的,当只有一个测试使用它时,这是一种浪费。
因此,您还有另外两个选项可以提供一种方法来避免不必要地创建和销毁上下文的开销。
参考
最后的想法
坦率地说,如果这是一个如此独特的测试,为什么一定要有一套理论呢?简单地把它作为一个单独的测试。
我正在使用 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
的每个运行设置一次测试数据?我知道我可以把它放在测试 class 的构造函数中,但我不想这样做,因为如果这是 class 中唯一使用该数据的测试,这似乎没有必要。
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<>
在测试 class 上实现),它可以提供以下逻辑单个测试上下文 在测试中共享 对于单个 class 在需要的地方。然后在完成所有这些本地测试后清理。
否则,如果想法被重复使用,可以使用 Collection Fixture 当一个测试上下文被创建一次然后在许多不同的测试之间共享 classes 并且一旦完成, 然后会被清理掉。
但是您提到可以使用 constructor/dispose,这将为 class 上的每个测试 创建和销毁一个新的上下文 ;正如您所提到的,当只有一个测试使用它时,这是一种浪费。
因此,您还有另外两个选项可以提供一种方法来避免不必要地创建和销毁上下文的开销。
参考
最后的想法
坦率地说,如果这是一个如此独特的测试,为什么一定要有一套理论呢?简单地把它作为一个单独的测试。