2016-01-18 236 views
1

由於這個SO answer我已經成功地測試發佈PRISM EventAggregator的事件(與FakeItEasy僞造)測試訂閱EventAggregator

[TestCase] 
public void test_that_publish_occured() 
{ 
    var fakeEventAg = A.Fake<IEventAggregator>(); 
    var fakeEvent = A.Fake<MyEvent>(); 

    A.CallTo(() => fakeEventAg.GetEvent<MyEvent>()) 
     .Returns(fakeEvent); 

    MyViewModel mvm = new MyViewModel(fakeEventAg); 

    mvm.ICommandThatCausesPublishToBeCalled.Execute(); 

    A.CallTo(() => fakeEvent.Publish(A<SomeClass>.Ignored)) 
     .MustHaveHappened(); 
} 

但我沒能測試訂閱此事件。我嘗試了以下,但我得到一個異常「非虛擬方法不能被攔截」。

[TestCase] 
public void test_that_event_is_listened() 
{ 
    var fakeEventAg = A.Fake<IEventAggregator>(); 
    var fakeEvent = A.Fake<MyEvent>(); 
    A.CallTo(() => fakeEventAg.GetEvent<MyEvent>()) 
     .Returns(fakeEvent); 

    // subscription occurs in the constructor 
    MyViewModel2 mvm2 = new MyViewModel2(fakeEventAg); 

    A.CallTo(() => fakeEventAg.GetEvent<MyEvent>() 
     .Subscribe(A<Action<PayloadClass>>.Ignored)) 
     .MustHaveHappened(); 
} 

如何測試訂閱事件是否已發生?它不必是單元測試,但也可以是集成測試。

+1

錯誤發生是因爲'Subscribe'方法不是虛擬的,因此不能被模擬。我發現'EventBase'類(MyEvent'基於)具有'Subscriptions'屬性。也許你可以檢查這個集合來驗證你的事件已經被添加了嗎? –

+0

是的,如果我使用真實的EventAggregator,Subscriptions屬性將起作用。假冒EA,它仍然是0.但是我也可以用真正的EA來做測試,所以它解決了我的問題。謝謝!如果您將您的評論寫入答案,那麼我也可以將其標記爲選定答案! – bitman

回答

1

錯誤發生是因爲Subscribe方法不是虛擬的,因此不能被模擬。我看到EventBase類(其中MyEvent基於此類)具有Subscriptions屬性。您應該能夠檢查該集合以驗證您的活動已添加。

+0

當然,我不得不使用反射來獲得訂閱屬性,但我想這在測試中沒問題... – bitman

+0

您的事件實際派生於哪一類?我假設它就像'CompositePresentationEvent'。 'EventBase'類實際上並沒有實現'Subscribe'方法,但派生類可以。如果您實際上正在實施'訂閱'方法,則可以將其改爲虛擬以便嘲笑。或者,'EventBase'類有一個受保護的虛擬'InternalSubscribe'方法,可能是可嘲弄的(不知道Moq是否執行受保護的方法,但我會假設它是這樣做的)。 –

+0

'MyEvent'派生自'PubSubEvent',後者又來自'EventBase'。我不是自己實施'訂閱',而是依靠PRISM。重寫'Subscribe'肯定是一個選項,但在這種情況下,最好使用反射來獲得'Subscriptions'。 – bitman