2010-02-18 46 views
1

我有一個作爲參數傳入方法的對象。這個對象有一個事件,當我用這個對象作爲參數調用這個方法時,它應該被訂閱。NUnit是否提供了一種方式來聲明對象事件被訂閱?

NUnit是否允許我檢查?

編輯:添加了代碼示例:

[Test] 
    public void AddingToCollectionShouldHookPropertyChangedEventUp() 
    { 
     // Arrange: 
     var viewModel = new viewModel(); 
     var viewModelCollection = new viewModelCollection(); 

     // Act: 
     viewModelCollection.AddViewModel(viewModel); 

     // Assert that the property changed event is hooked up in some way: 
     // This is commented out because I cannot do this. I left it here to 
     // illustrate what I want to achieve: 
     //blockViewModel.PropertyChanged.Should().Not.Be.Null(); 
    } 
+0

您能否粘貼您的代碼示例? – 2010-02-18 10:23:54

回答

3

您無法瞭解事件的狀態;通過設計,你只能註冊到它+ =或取消註冊 - =從它。因此,NUnit沒有擴展或其他機制來測試已訂閱的事件。

如果事件在接口上,您可以通過模擬類(您自己或框架的模擬器,如Rhino)測試訂閱。

無論如何你當然可以測試事件的行爲!

如果你發佈了一些代碼,我相信有人會幫你想出一個有意義的測試。下面是一個示例虛擬人給你一些建議:

[Test] 
public void ChangingTheWhateverProperty_TriggersPropertyChange() 
    { 

     // Create anonymous delegate which is also your test assertion 
     PropertyChangedEventHandler anonymousDelegate = (sender, e) => Assert.AreEqual("Whatever", e.PropertyName); 

     // Subscribe to the needed event 
     vm.PropertyChanged += anonymousDelegate; 

     // trigger the event 
     vm.Whatever = "blah"; 
    } 

HTH,
Berryl

===修改示例代碼=======

[Test] 
    public void AddingToCollectionShouldHookPropertyChangedEventUp() 
    { 
     // Arrange: 
     var viewModel = new viewModel(); 
     var viewModelCollection = new viewModelCollection(); 

     // This *IS* your assert also, and will get called back when you Act 
     // The only part you need to supply for this test is the property that gets fired when you add a viewmodel 
     PropertyChangedEventHandler anonymousDelegate = (sender, e) => Assert.AreEqual("Whatever", e.PropertyName); 

     // Subscribe to the needed event 
     viewModelCollection.PropertyChanged += anonymousDelegate; 

     // Act: 
     viewModelCollection.AddViewModel(viewModel); 
    } 

= ==舉例用於事件註冊的rhino測試=====

[Test] 
    public void Test() 
    { 
     var mockCorpseKicker = MockRepository.GenerateMock<INotifyPropertyChanged>(); 
     mockCorpseKicker.PropertyChanged += null; 
     mockCorpseKicker.AssertWasCalled(x => x.PropertyChanged += Arg<PropertyChangedEventHandler>.Is.Anything); 
    } 
+0

我一直在試圖避免使用模擬框架,但如果這是唯一的方法,我應該重新考慮這一點。謝謝回覆。 – Corpsekicker 2010-02-19 05:17:37

+0

但是您不需要模擬frameowrk來測試將viewmodel添加到viewmodelcollection會觸發您的屬性更改。我讚揚我的虛擬測試案例有點突出這一點,但我不知道你已經發布了哪些你想要發射的屬性。在我的測試中替換屬性名稱,您將進行一次工作測試,證明接線是正確的。 – Berryl 2010-02-19 14:34:31

+0

我並非試圖斷言任何事情都會被解僱。我試圖斷言事件是訂閱的。換句話說,我想確保在我的AddViewModel(ViewModel viewModelToAdd)方法中有一行說 viewModelToAdd.PropertyChanged + = PropertyChangedHandler; – Corpsekicker 2010-02-20 07:27:21

-1

你可以只檢查該事件是否爲空。如果它有訂閱者,那麼它不會爲空。

+1

你可以顯示這樣的代碼嗎?像「Assert.That(_vm.Workspaces.CollectionChanged,Is.Not.Null);」將不會越過編譯器,因爲「事件只能出現在+ =或 - =」的左側。乾杯 – Berryl 2010-02-18 23:19:55

+1

這是錯誤的。你不能從類的範圍之外得到一個調用列表。 – Corpsekicker 2010-02-19 05:16:17

相關問題