在MVVM Light的ViewModel的测试用例中处理异常的优雅方法

时间:2014-07-31 18:32:14

标签: wpf unit-testing mvvm mstest

我正在使用mvvm light toolkit开发一个wpf应用程序。每当某些事情超出业务逻辑时,我们都会使用消息框提示用户,并使用

将视图模型中的消息发送到视图

Messenger.Default.Send(Token,"这里有一些短信");

现在我正在为视图模型编写测试用例,在某些情况下,Code Under Test与此类消息调用相关联。这些是我的例外,但测试用例不会将它们视为异常,只要它不被throw异常调用(" message")

建议。

2 个答案:

答案 0 :(得分:0)

假设您正在从VM向View发送消息,该消息处理实际的“显示逻辑”,那么只需在VM测试中注册该消息并验证它是否已发送/接收。例如:

[TestMethod]
public void SendSomethingBadHappenedMessageTest()
{
    const string expected = "oh noes!";
    string actual = null;

    // Register for message to ensure message was sent from VM
    Messenger.Default.Register<SomethingBadHappenedMessage>(this, 
        message => actual = message.Message);

    // Assuming command triggers Messenger.Send
    _viewModel.SomethingBadHappenedCommand.Execute(expected);  

    Assert.AreEqual(expected, actual);
}

如果您测试异常,只需使用ExpectedException属性标记测试方法。

答案 1 :(得分:-1)

我假设您正在尝试验证业务逻辑是否检测到问题,并且在您的测试用例中“显示”了正确的消息框。如果是这样,我就是这样做的:

  • 创建UserNotificationService和IUserNotificationService接口,而不是使用消息传递。具体实现类似于:
public class UserNotificationService : IUserNotificationService
{
   public void MessageBox(string message)
   {
      // code to make the message box pop up goes here
   }
}
  • 在视图模型的构造函数中注入IUserNotificationService(因为您使用的是SimpleIoC),您已经拥有mvvm-light并使用它与用户进行通信。

    < / LI>
  • 进行单元测试时,要么模拟IUserNotificationService,要么创建一个能够验证正确消息/错误的新FakeUserNotificationService类。将它放在正在测试的视图模型的构造函数中。

public class FakeUserNotificationService : IUserNotificationService
{
   public void MessageBox(string message)
   {
      LastMessage = message;
   }

   public string LastMessage {get; set;}
}

在你的测试中:

var ns = new FakeUserNotificationService();
var viewModel = new MyViewModel(ns);

viewModel.DoSomethingBad();

Assert.AreEqual(ns.LastMessage, "expected error message");