为什么我的起订量IEventAggregator验证失败?(Why does my Moq IEve

2019-10-17 03:27发布

我使用的复合WPF(棱镜),我试图单元测试,我的控制器事实上确实订阅复合事件。

我申购代码如下...

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

我的单元测试代码如下(我用的起订量为我的模拟框架和统一作为我的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 ......”

任何想法,我做错了什么?

Answer 1:

在你的代码,它似乎像eventAggregatorMock从未使用过的实例。 我猜想,你需要与容器注册它,这样它正在使用的controllerToTest



Answer 2:

  1. 你似乎在你的单元测试是测试太多。 你不应该需要一个容器,你应该创建你的控制器提供模拟的依赖,因为你应该只测试1东西在单元测试(你不需要测试的DI框架的工作,因为它通常不;-) )。 它还将确保您提供正确的嘲笑,现在是不是从你的代码清楚马克塞曼在他的回答中指出。

  2. 您可以尝试设置在开始下一个问题的方法调用。 有时,它似乎有助于最小起订量适当地验证类。 在这种情况下,你可能还需要设置您的仿制品的行为是Strict在构造函数中,这样你会得到测试失败等,意外调用你的模拟。


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


Answer 3:

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

如果你使用ThreadOption.UIThread,它调用Dispatcher.Invoke将没有消息循环工作; 对于通常不以单位测试运行。



文章来源: Why does my Moq IEventAggregator verification fail?