我有一个应用程序,根据Sim对象的状态引发事件。特别是,如果Sim状态改变-即从PinRequired到Accessible-OnStatus事件将被触发。这些事件通过新线程通知侦听器。
我在单元测试中使用Moq,并能够断言OnStatus是否已被触发:
[Test]
public void TestOnStatusIsRaised()
{
Sim sim = new Sim();
sim.OnStatus += OnStatus;
lock (this)
{
sim.UpdateSimInfo(new Info("a new status"));
Monitor.Wait(this);
}
Assert.IsTrue(_onStatusCalled);
}
private void OnStatus(SimStatus obj)
{
lock (this)
{
_onStatusCalled = true;
Monitor.Pulse(this);
}
}
正如您所见,使用Monitor类,我可以等待事件被触发后再进行断言,确保_onStatusCalled标志已设置为true。
当我想要断言事件未被触发时,我的困难就出现了。我无法使用Monitor等待事件不被触发,因为测试将永远等待!我可以添加一个超时来等待,但那似乎是一个肮脏的hack。
我尝试了以下方法:
[Test]
public void TestOnStatusIsNotFired()
{
Sim sim = new Sim();
sim.OnStatus += onStatus => Assert.Fail("OnStatus Was called");
sim.UpdateSimInfo(new Info("the same status"));
}
但是它不能工作-在修复代码以确保事件未被触发之前,测试总是通过。我甚至已经逐步执行了代码,并观察到Assert.Fail()
抛出了异常,但这并不会导致测试失败,因为我的事件被包含在try / catch块中,NUnit异常被捕获。
有什么想法吗?