我班上有一个计时器,我只想要其中一个计时器,所以我在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();
}
因此避免了我可能有两次运行的机会 - (因为他们访问文件系统中的单个资源)
更新:更正了从单元测试到集成测试的术语。
答案 0 :(得分:3)
没有。我会说那是一个坏主意(tm)。
单元测试需要测试单个功能单元。实际上,在任何一个测试中都应该只有一个类被实例化。
通过让你的Timer类成为单身,我觉得你将测试一个恰好使用你的Timer的类。然后,该测试将测试两个类。不要这样做!
相反:
在测试使用Timer的类时,您应该创建一个Timer类的模拟并将其传递给您正在测试的类。然后,如果你破坏Timer类,Timer类测试失败,但所有其他类仍将通过。调试是小菜一碟,因为你会立即知道它是你的Timer类坏了。
答案 1 :(得分:2)
这是一个非常糟糕的主意,因为它将您的单元测试链接在一起,因此它们不再独立。这可能导致副作用,一些测试仅在与其他测试一起执行时失败,或者相反。尽可能避免使用它。静态类和成员也是如此。
<强>更新强>
既然你澄清了你的问题,那就让我这样说:
TearDown
方法。在这种方法中,您可以确保清理计时器。答案 2 :(得分:1)
你可以重组你的测试吗?本质上,如果你创建一个单例,那么实际上只能有一个,如果你的测试需要多个计时器,那么你应该重新组织它们以使用已经存在且活动的计时器。
答案 3 :(得分:1)
谁可以停止计时器?如果只有一个,那么对Stop()的任何调用将停止计时器。
您可能最好使用 Fixture (如XUnit.Net中的IUseFixture<>
)来处理此问题。