繁体   English   中英

MVVM单元测试-消息总线仅工作一次

[英]MVVM unit tests - message bus only works once

我正在尝试使用SimpleMvvmToolkit针对视图模型编写一些单元测试,并且其中一些测试需要将消息发送到消息总线以引发视图模型内部的事件。 问题在于,我只能“使用”消息总线一次; 发送消息的第一个测试通过,但是发送消息的其他两个测试失败。 但是,如果我分别运行每个测试,则所有三个测试都通过了;如果更改顺序,则第一个测试(无论是哪个测试)都将通过。

这是其中一项测试的样本。

[TestMethod]
public void DeleteRequest()
{
    // mock the driver transaction service

    var driverTransactionService =
         new Mock<Services.IDriverTransactionService>();

    var viewModel = new ValidationRequestViewModel(
         driverTransactionService.Object);

    driverTransactionService.Setup(dts =>
         dts.DeleteValidationRequest(It.IsAny<Action<int>>(), 
              It.IsAny<Action<Exception>>(),
              It.IsAny<int>()))
        .Callback((Action<int> action, Action<Exception> ex, int id) => 
             action.Invoke(requestId));

    // make a validation request and add to the collection

    var validationRequest = new ValidationRequest...

    var collection = viewModel.ValidationRequestView.SourceCollection as 
         ObservableCollection<ValidationRequest>;

    collection.Add(validationRequest);

    //  delete the validation request; send the confirmation message as if
    //  the user clicked yes

    viewModel.DeleteValidationRequest(validationRequest);

    MessageBus.Default.Notify(
         NotificationMessages.DeleteValidationRequestConfirmation, 
         this, new NotificationEventArgs<String>(null, null));

    // verify the service call was made

    driverTransactionService.Verify(dts => 
         dts.DeleteValidationRequest(It.IsAny<Action<int>>(), 
              It.IsAny<Action<Exception>>(), requestId));
}

因此,我正在创建服务的模拟(它是WCF服务的包装器),并验证是否正在调用该服务上的DeleteValidatonRequest。 在这种情况下,需要消息总线,因为如果用户单击“确定”,通常会弹出一个确认对话框,并发送DeleteValidationRequestConfirmation消息。

测试在最后一行(Verify)失败,并且在我调试时,视图模型中消息的处理程序永远不会执行,因此看起来消息从未真正发送过。 同样,只有在测试不是将消息发送到总线的第一个测试时,测试才会失败。 如果它是单独执行还是第一次执行,则测试通过。

有任何想法吗? 所有测试都是独立的,并且不共享测试类的任何属性或变量,因此我看不到它们之间如何相互影响。

编辑:我使用反射在消息通常会触发的视图模型上调用受保护的方法; 这使我获得了所需的代码覆盖率,只是没有验证视图模型是否正确响应了消息。

编辑2:废话,视图模型上的PropertyChanged事件也发生了同样的事情。 仅当测试是独立运行还是第一次运行时,事件处理程序才会触发。

我不熟悉SimpleMvvmToolkit,但是我熟悉消息传递的概念。

不要使用MessageBus.Default 修改ViewModel使其具有MessageBusIMessageBus如果存在)构造函数参数。 现在,您的测试将被隔离,因此您可以一次运行所有测试,它们应该通过。

此外,如果存在IMessageBus接口,则可以模拟它,这将使测试ViewModel更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM