【发布时间】:2018-02-03 15:26:19
【问题描述】:
我正在使用 Moq 在 WPF 中编写单元测试,以测试用户在关闭时是否单击了 YesNoCancel MessageBox 上的“是”按钮窗户。在我的CloseCommand 中,当用户关闭窗口时,我的 ViewModel 中会给出以下消息:
var result = _messageSvc.Show(
"Do you want to save changes?",
"Save Changes",
Services.MessageBoxButton.YesNoCancel,
Services.MessageBoxIcon.Question,
Services.MessageBoxResult.Yes);
我的_messageSvc 是自定义消息服务内部的私有实例,用于显示消息框。这是服务的代码:
public interface IMessageSvc
{
void Show(string message);
MessageBoxResult Show(string message, string caption, MessageBoxButton buttons, MessageBoxIcon icon, MessageBoxResult defaultResult = 0);
}
public class MessageSvc : IMessageSvc
{
public void Show(string message)
{
MessageBox.Show(message);
}
public MessageBoxResult Show(string message, string caption, MessageBoxButton buttons, MessageBoxIcon icon, MessageBoxResult defaultResult)
{
return (MessageBoxResult)MessageBox.Show(message, caption, (System.Windows.MessageBoxButton)buttons, (System.Windows.MessageBoxImage)icon, (System.Windows.MessageBoxResult)defaultResult);
}
}
注意:MessageBoxButton、MessageBoxIcon 和 MessageBoxResult 是我在同一个文件中创建的枚举,以模仿 .NET 开箱即用的功能。为了便于阅读,我没有在这里展示它们
我的单元测试是:
[TestMethod]
public void ShouldAskToSaveOnCloseRespondYesTest()
{
// Mock and setup initial user data
var u= new User
{
UserId = 1,
UserName = "FirstName LastName",
FavoriteColor = "Blue"
};
mainViewModel.UserInfo= new UserInfoDtoWrapper(u);
// assert the data has not changed yet
Assert.IsFalse(mainViewModel.UserInfo.IsChanged);
// change the user data
mainViewModel.UserInfo.UserName= "LastName FirstName";
// assert the data has changed
Assert.IsTrue(mainViewModel.UserInfo.IsChanged);
// execute window closing
mainViewModel.CloseCommand.Execute(new object());
// verify messagebox shows and the 'Yes' button is clicked
// this will then save the changes made to the user instance
var messageBox = new Mock<IMessageSvc>();
messageBox.Setup(x => x.Show(It.Is<string>(y => y == "Do you want to save changes?"),
It.Is<string>(y => y == "Save Changes"),
It.Is<MessageBoxButton>(y => y == MessageBoxButton.YesNoCancel),
It.Is<MessageBoxIcon>(y => y == MessageBoxIcon.Question),
It.Is<MessageBoxResult>(y => y == MessageBoxResult.Yes)))
.Returns(MessageBoxResult.Yes);
messageBox.Verify();
}
错误出现在messageBox.Verify() 行,但据我所知,我做得正确。我需要获取消息框的返回值以继续测试用户单击“是”按钮后会发生什么,所以我不想在内部使用带有 Linq 查询的Verify,而是需要捕获结果。
谢谢
【问题讨论】:
-
“错误出现在 messageBox.Verify() 行” - 什么错误?
-
ShouldAskToSaveOnCloseRespondYesTest 抛出异常:Moq.MockVerificationException:以下设置不匹配:IMessageSvc x=> x.Show(It.Is
(y => y == "是否要保存更改?"), It.Is (y => y == "保存更改") . . . -
设置和验证之间的其余代码在哪里?目前没有进行任何测试。
-
我想这就是我的问题所在。我需要验证消息框是否显示。然后我应该调用“MessageBox.Show”还是显示我在上面创建的 messageBox 对象?
标签: c# wpf unit-testing mvvm moq