2009-11-10 78 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,以確保有足夠的時間讓事件處理程序啓動 - 有時會發生競態條件。

相關問題