每个测试的单元测试和模拟

时间:2016-02-11 04:02:54

标签: c# .net unit-testing

有时在我的测试中,我需要执行一个不同的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())。

如果是这种情况:

  1. 如何纠正这种情况?
  2. 对于不同的模拟场景,如果想要一个传递参数的单个方法(如setup()),那么正确的方法是什么?

2 个答案:

答案 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。