测试事件聚合器的订阅

本文关键字:事件 测试 | 更新日期: 2023-09-27 18:30:46

多亏了

这个答案,我设法测试了PRISM EventAggregator的发布事件(用FakeItEasy伪造)

[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属性。您应该能够检查该集合以验证是否已添加事件。