我的一些单元测试之间存在冲突。 我有一个静态事件的类,当我一次运行一个测试时我没有问题,但是当我批量运行所有测试时,触发事件的测试将因为注册的监听器(具有在之前的测试中注册了该事件。)
显然,我不希望在测试类触发事件时执行事件处理程序,那么最佳解决方案是什么?
我知道如果事件不是静态的话我不会有问题,但如果有另一种解决方案,我宁愿不必重新设计它。
在运行测试之前分离所有事件监听器可能是一个解决方案,但我认为不可能从类外部进行(这似乎是正常的原因我们不希望客户端能够分离所有其他监听器),从内部做这意味着我必须在类中添加一个方法,仅用于单元测试,这是不好的做法。
有没有办法在隔离模式下运行测试,以防止其他先前的测试影响它?就像它是在一个完全分离的进程中运行一样,这样我就不会得到对静态事件的相同引用? (但我仍然需要能够通过简单的点击批量执行所有测试)
感谢您的帮助和想法!
有关我正在使用Visual Studio 2012单元测试框架的信息。
答案 0 :(得分:5)
在每个单独的测试中,您将自己附加到静态事件。所以只需之前断言就可以简单地分离自己或更好来保护finally块中的分离:
[TestCase]
public void MyTestDetachingBeforeAssert()
{
bool finishedCalled = false;
var eventListener = new EventHandler((sender, e) => finishedCalled = true);
MyClass.Finished += eventListener;
// Can lead to detach problems if this throws an exception!
MyClass.DoSomething();
MyClass.Finished -= eventListener;
Assert.That(finishedCalled);
}
[TestCase]
public void MyTestDetachingInFinally()
{
bool finishedCalled = false;
var eventListener = new EventHandler((sender, e) => finishedCalled = true);
try
{
MyClass.Finished += eventListener;
MyClass.DoSomething();
Assert.That(finishedCalled);
}
finally
{
MyClass.Finished -= eventListener;
}
}