c#singleton继承自非单例进行集成测试

时间:2011-03-30 08:30:18

标签: c# unit-testing singleton

我班上有一个计时器,我只想要其中一个计时器,所以我在Main中有一个静态引用。在集成测试期间(不在正常运行时),它通过不同的测试多次实例化。

我的想法是创建一个继承所有功能的Singleton,以确保只有一个。如果这是明智的话我会徘徊,还是会遇到一些我还没有想到的陷阱?

例如在我的集成测试中,我目前正在使用

[TestMethod]
public void SomeTimerTest()
{
    MyTimer t = new Mytimer();
    t.Start();
}

然而在这个改变之后我会用

[TestMethod]
public void SomeTimerTest()
{
    //creates a new instance or retrieves an already existing one
    MytimerSingleton.Instance.Start();

}

因此避免了我可能有两次运行的机会 - (因为他们访问文件系统中的单个资源)

更新:更正了从单元测试到集成测试的术语。

4 个答案:

答案 0 :(得分:3)

没有。我会说那是一个坏主意(tm)。

单元测试需要测试单个功能单元。实际上,在任何一个测试中都应该只有一个类被实例化。

通过让你的Timer类成为单身,我觉得你将测试一个恰好使用你的Timer的类。然后,该测试将测试两个类。不要这样做!

相反:

在测试使用Timer的类时,您应该创建一个Timer类的模拟并将其传递给您正在测试的类。然后,如果你破坏Timer类,Timer类测试失败,但所有其他类仍将通过。调试是小菜一碟,因为你会立即知道它是你的Timer类坏了。

答案 1 :(得分:2)

这是一个非常糟糕的主意,因为它将您的单元测试链接在一起,因此它们不再独立。这可能导致副作用,一些测试仅在与其他测试一起执行时失败,或者相反。尽可能避免使用它。静态类和成员也是如此。

<强>更新
既然你澄清了你的问题,那就让我这样说:

  1. 您的单元测试应该是自包含的,这意味着您不应该访问文件系统,因为这会再次引入测试之间可能产生副作用。
  2. 您可以引入在每次测试后调用的TearDown方法。在这种方法中,您可以确保清理计时器。

答案 2 :(得分:1)

你可以重组你的测试吗?本质上,如果你创建一个单例,那么实际上只能有一个,如果你的测试需要多个计时器,那么你应该重新组织它们以使用已经存在且活动的计时器。

答案 3 :(得分:1)

谁可以停止计时器?如果只有一个,那么对Stop()的任何调用将停止计时器。

您可能最好使用 Fixture (如XUnit.Net中的IUseFixture<>)来处理此问题。