2009-07-27 51 views
1

我使用复合WPF(棱镜),我试图单元测试,我的控制器确实订阅复合事件。为什么我的Moq IEventAggregator验证失败?

我申购代码如下...

//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 ......”

一呃想知道我做错了什么?

回答

0

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

0
  1. 您似乎在单元测试中测试过多。你不应该需要一个容器,你应该创建你的控制器来提供模拟依赖关系,因为你应该只在单元测试中测试1件事(你不需要像通常那样测试DI框架的工作方式;-) )。它还将确保您提供正确的模拟,现在从您的代码中可以看出,Mark Seemann在他的答案中指出了这一点。

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


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