使用Singleton的单元测试代码

时间:2015-01-08 17:50:39

标签: unit-testing tdd automated-tests integration-testing

我有使用Singleton的代码(这恰好适用于网站,因此Singleton只有一个Request的范围;每个Request都有自己的单例)。

我的代码(碰巧在HttpModule中)执行以下操作:

1 - 检查Singleton对象是否为null,如果是,则初始化它。 2 - 沿着以下行更新此单例对象上的属性:

if(A)
{
    SingletonHolder.Current.X = Y;
}
else
{
    SingletonHolder.Current.X = Z;
}

然后,我希望围绕此方法进行一些单元测试,以检查逻辑是否正确。让我们说为了论证我们需要以下4个测试:

  1. GivenMethodCall_When的 A _ThenXSetTo的ý
  2. GivenMethodCall_When的 A _ThenX的 SetTo的ž
  3. GivenMethodCall_When的 NOTA _ThenXSetTo的ž
  4. GivenMethodCall_When的 NOTA _ThenX的 SetTo的ý
  5. 这些测试在一次运行时都能很好地工作,但是当使用NUnit测试运行器在VS2013中运行时,我们会遇到一些失败,因为每个测试都是并行运行的,而且测试中的方法正在更新相同的单例对象的属性具有不同的值。

    有关解决此问题的模式的任何建议吗?

    由于

    格里夫

1 个答案:

答案 0 :(得分:0)

您可能只需要在使用SetUpAttribute方法修饰的测试夹具中提供一个方法,以便在运行每个测试方法之前执行初始设置,并使用{{1在每个测试方法之后运行。找到了nUnit TearDownAttribute的文档here

这将允许您(在您的SetUp方法中)初始化您的Singleton对象,然后(在您的TearDown方法中)将Singleton对象设置为SetUpAttribute,以便SetUp可以重新实例化/初始化对象下一次测试。