1

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

我的订阅代码如下...

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

知道我做错了什么吗?

4

3 回答 3

0

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

于 2009-08-12T08:18:58.830 回答
0

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

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

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

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


eventBeingListenedTo.Setup(e => e.Subscribe(It.IsAny<Action<string>>(), ThreadOption.UIThread));
于 2009-12-16T10:30:17.110 回答