有时在我的测试中,我需要执行一个不同的Setup()调用,为每次测试运行设置不同的Mocks - 如下所示:
private void Setup(bool isTrue)
{
mock.Setup(x => x.DisplayNames).Returns(new Dictionary<int, string>());
// ...
// 5x more of these are the same for all tests
if (isTrue)
mock.Setup(x => x.DisplayOld).Returns(isTrue);
// 5x more of these parameterlized setups
...
}
现在,在我的每个单元测试中,我都会调用Setup(true / false)。
由于单元测试是并行运行的(默认情况下为xUnit),这会导致任何锁定问题吗? (假设两个测试同时调用Setup())。
如果是这种情况:
答案 0 :(得分:0)
您需要使用参数化单元测试。可以使用xUnit测试框架的InlineData属性。在这种情况下,不需要在设置方法中设置模拟。它可以直接在实际测试方法中设置。您的测试方法如下所示
[Theory]
[InlineData(false)]
[InlineData(true)]
public void SampleTest(bool flag)
{
.... //do any set up operations
.... //Assert logic to verify
}
测试框架将根据您使用InlineData属性提供的输入在运行时生成尽可能多的测试方法。由于测试方法在运行时被拆分为单独的方法,因此您不会遇到任何锁定或线程问题。
答案 1 :(得分:0)
查看有关Test Context模式的文章。您可以将mocks作为局部变量,并在测试上下文类中自定义它们的设置。然后并行运行它们是安全的。我在Java中使用JUnit + Mockito,在.Net中使用NUnit / MSTest + Moq。