c# - 测试订阅 EventAggregator

标签 c# unit-testing testing eventaggregator

多亏了这个SO answer我已经成功地测试了 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 属性。您应该能够检查该集合以验证您的事件是否已添加。

关于c# - 测试订阅 EventAggregator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856961/

相关文章:

javascript - jquery中的单元测试功能

javascript - 使用 HTML 上下文对 Javascript 进行单元测试

load - 如何在 Visual Studio 负载测试中关闭缓存请求

bash - Shell - 表达式中的语法错误(错误标记为 "0 ")

javascript - Protractor :根据 html 属性选择元素的语法

c# - SftpClient.UploadFile 和 SftpClient.WriteAllBytes 有什么区别?

c# - 如何使用 OpenXml 2.0 将任何文件类型嵌入到 Microsoft Word 中

c# - 打印包含所有行和所有列的 datagridview 的最佳方法?

c# - 全局更改 MVC 中生成的 URL

android - 单元测试使用 ViewModelScope.launch 调用具有延迟的挂起函数的 ViewModel 方法