2009-11-10 63 views
1

我可以测试一个事件被解雇的断言吗?事情是这样的:有没有办法对事件进行断言?

[TestMethod] 
public void EventFiresWhenChangingProperty() 
{ 
    var sut = new SystemUnderTest(); 
    var eventRegister = new EventRegister(sut.PropertyChanged); 
    sut.AnyProperty = "new value"; 
    Assert.EventWasFired(eventRegister); 
} 

当然我可以创建一个事件处理程序,即把一些记录到测试环境或在一个实例变量,只能由这个特定的测试读取但这似乎有点过分管道。我正在寻找类似上面的代码。

回答

4

我通常挂钩匿名方法作为一个事件监听器,并且在其设置一个可测试值,如下所示:

var sut = new SystemUnderTest(); 
bool eventWasRaised = false; 
sut.PropertyChanged += (s, e) => eventWasRaised = true;  
sut.AnyProperty = "new value"; 
Assert.IsTrue(eventWasRaised); 

这使管道的最小量。如果你想添加一些清理,您可以创建一个变量保存事件处理程序:

var sut = new SystemUnderTest(); 
bool eventWasRaised = false; 
EventHandler eh = (s, e) => eventWasRaised = true; 
sut.PropertyChanged += eh; // attach event handler 
sut.AnyProperty = "new value"; 
Assert.IsTrue(eventWasRaised); 
sut.PropertyChanged -= eh; // detach event handler 
+0

不错的一个。当把这些东西写在上面的时候,用匿名方法做一些事情已经在我的脑海里了......但是却是一种非常抽象的形状。 – 2009-11-10 08:22:57

0

虽然起初似乎“不需要的管道”代码添加一个监听器的事件实际上是一个好主意,我认为你应该这样做来测试事件。

有一些模拟框架可以让你做你想做的事情,但它增加了你的代码的附加依赖。

保持简单 - 订阅活动。

0

我跟弗雷德里克·莫克的解决方案达成一致,公平地经常使用它。一个注意事项:最好在触发操作之后插入至少20-30毫秒的Sleep,以确保有足够的时间让事件处理程序启动 - 有时会发生竞态条件。

相关问题