WPF& MVVM - 单元测试和弹出消息框或对话框

时间:2013-03-27 15:55:41

标签: c# wpf mvvm

我正在MVVM中编写一个应用程序,迄今为止效果很好。 但我正在ViewModel中工作,它会引发一个错误,我想向用户展示这个错误让他们知道。

可以在我的ViewModel(VM)中执行类似的操作:

MessageBox.Show(errorMessage);

或者更可能是这样的:

new ErrorMessageWindow(errorMessage).ShowDialog()

所以我可以设计它。

问题是我正在从VM创建一个UI弹出窗口。 我正在为应用程序创建单元测试,它也会弹出窗口并停止运行,直到它被手动关闭。

寻找一个好的方法。

我正在考虑在VM中引发一个事件 - 但由于View真的不知道VM或其属性,我不知道如何订阅它。

我没有使用任何外部框架 - 我宁愿自己实现任何东西。

3 个答案:

答案 0 :(得分:4)

我一般为viewmodel提供了一种方式来表示它需要引发错误。您可以通过依赖注入,将其传递给构造函数等来完成此操作。实现由包含应用程序或绑定视图提供。

当您进行测试时,您将传递“显示错误消息”功能的测试实现,该功能仅验证是否已调用它以及是否请求了正确的错误消息。理想情况下,您将viewmodel限制为将格式字符串的资源名称和参数数组传递给它,以便它也适用于国际化。

答案 1 :(得分:3)

你应该反对抽象,以便在单元测试期间交换实现。

例如,您可以使用IWindowManager方法使用ShowDialog方法,然后使用一个调用MessageBox的实现(或生产期间您需要的任何技术),然后您就可以使用隔离框架或为单元测试创​​建测试实现,它将您想要的结果作为控制变量返回到测试中。

您真的应该考虑using an MVVM frameworkCaliburn.Micro之类的内容已经有IWindowManager接口。

答案 2 :(得分:2)

我建议你放弃传统的Win32 dialogs。如果有什么事情,最好在WPF中完成对话,并使用例如绑定到bool的对话框来提高ViewModel的可见性。这很容易测试,因为您甚至不需要创建Window Manager的模拟类。

关于如何在WPF中创建自己的弹出对话框的简单示例here

您还可以使用对话框服务here找到替代实现,以帮助您从ViewModel移动对话框的创建。这允许您在单元测试期间模拟对话服务。