2013-03-27 108 views
1

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

- 我写在MVVM应用程序中使用至今了良好的效果。 但我正在ViewModel中工作,这引发了一个错误,我想向用户展示这个错误,让他们知道。


可以只是做我的视图模型(VM)是这样的:

MessageBox.Show(errorMessage); 

或者更可能是这样的:

new ErrorMessageWindow(errorMessage).ShowDialog() 

,所以我可以样式。

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

寻找一个好方法。

我正在考虑在虚拟机中引发事件 - 但由于View实际上并不知道虚拟机或其属性,所以我不知道如何订阅它。

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

回答

4

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

当您测试时,您接着传递“显示错误消息”功能的测试实现,该功能仅验证它是否被调用以及是否请求了正确的错误消息。理想情况下,您限制视图模型将资源名称和参数数组传递给格式字符串,以便它可以与国际化一起使用。

2

我会建议你远离传统的Win32 dialogs。如果有任何事情,最好在WPF中完成对话框,并使用例如绑定到布尔的可见性对话框从ViewModel提高它。这很容易测试,因为您甚至不需要创建窗口管理器的模拟类。

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

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

3

您应该对抽象进行处理,以便在单元测试期间替换实现。

例如,你可以有一个IWindowManager接口与ShowDialog方法,然后一个实现调用MessageBox(或您在生产过程中所需的任何技术),然后你可以使用一个隔离的框架或创建单元测试的测试执行它返回你想要的结果作为你测试中的控制变量。

你真的应该考虑using an MVVM framework,并且类似Caliburn.Micro已经有一个IWindowManager接口。