【问题标题】:Why does my Moq IEventAggregator verification fail?为什么我的 Moq IEventAggregator 验证失败?
【发布时间】:2010-11-14 07:24:40
【问题描述】:

我使用复合 WPF(Prism),我正在尝试对我的控制器确实订阅复合事件进行单元测试。

我的订阅代码如下...

//Init Events.
this.eventAggregator.GetEvent<PlantTreeNodeSelectedEvent>().Subscribe(
    ShowNodeDetails, ThreadOption.UIThread);

我的单元测试代码如下(我使用 Moq 作为我的 Mocking 框架,Unity 作为我的 DI 框架)...

Mock<PlantTreeNodeSelectedEvent> eventBeingListenedTo = new Mock<PlantTreeNodeSelectedEvent>();
eventAggregatorMock.Setup(e => e.GetEvent<PlantTreeNodeSelectedEvent>()).Returns(eventBeingListenedTo.Object);


//Initialize the controller to be tested.
IPlantTreeController controllerToTest = container.Resolve<IPlantTreeController>();


//Verify.
eventBeingListenedTo.Verify(
    e => e.Subscribe(It.IsAny<Action<string>>(), ThreadOption.UIThread));

正在调用此订阅方法(我已通过调试器运行验证),但验证始终失败,并显示“未在模拟上执行调用:e => e.Subscribe...”

知道我做错了什么吗?

【问题讨论】:

    标签: wpf unit-testing moq unity-container eventaggregator


    【解决方案1】:

    在您的代码中,似乎从未使用过 eventAggregatorMock 实例。我猜您需要在容器中注册它,以便controllerToTest 使用它。

    【讨论】:

      【解决方案2】:
      1. 您似乎在单元测试中测试了太多。您不需要容器,您应该只创建提供模拟依赖项的控制器,因为您应该只在单元测试中测试 1 件事(您不需要像通常那样测试 DI 框架是否有效;-) )。它还将确保您提供正确的模拟,现在您的代码并不清楚,正如 Mark Seemann 在他的回答中指出的那样。

      2. 您可以在开始时尝试设置有问题的方法调用。有时它似乎有助于 moq 适当地验证类。在这种情况下,您可能还希望在构造函数中将模拟行为设置为 Strict,这样您的模拟就会因其他意外调用而失败。


      eventBeingListenedTo.Setup(e => e.Subscribe(It.IsAny<Action<string>>(), ThreadOption.UIThread));
      

      【讨论】:

        【解决方案3】:

        使用这样的模拟聚合器(对于 Rhino.Mocks) http://adammills.wordpress.com/2010/12/13/auto-mocking-eventaggregator/

        如果您使用 ThreadOption.UIThread,它会调用 Dispatcher.Invoke,如果没有消息循环,它将无法工作;通常不会在单元测试中运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-10
          • 1970-01-01
          • 2010-11-03
          • 2012-08-21
          • 2018-06-10
          • 1970-01-01
          相关资源
          最近更新 更多