由於這個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();
}
如何測試訂閱事件是否已發生?它不必是單元測試,但也可以是集成測試。
錯誤發生是因爲'Subscribe'方法不是虛擬的,因此不能被模擬。我發現'EventBase'類(MyEvent'基於)具有'Subscriptions'屬性。也許你可以檢查這個集合來驗證你的事件已經被添加了嗎? –
是的,如果我使用真實的EventAggregator,Subscriptions屬性將起作用。假冒EA,它仍然是0.但是我也可以用真正的EA來做測試,所以它解決了我的問題。謝謝!如果您將您的評論寫入答案,那麼我也可以將其標記爲選定答案! – bitman