我正在使用mvvm light toolkit开发一个wpf应用程序。每当某些事情超出业务逻辑时,我们都会使用消息框提示用户,并使用
将视图模型中的消息发送到视图Messenger.Default.Send(Token,"这里有一些短信");
现在我正在为视图模型编写测试用例,在某些情况下,Code Under Test与此类消息调用相关联。这些是我的例外,但测试用例不会将它们视为异常,只要它不被throw异常调用(" message")
建议。
答案 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)
我假设您正在尝试验证业务逻辑是否检测到问题,并且在您的测试用例中“显示”了正确的消息框。如果是这样,我就是这样做的:
public class UserNotificationService : IUserNotificationService { public void MessageBox(string message) { // code to make the message box pop up goes here } }
在视图模型的构造函数中注入IUserNotificationService
(因为您使用的是SimpleIoC
),您已经拥有mvvm-light
并使用它与用户进行通信。
进行单元测试时,要么模拟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");