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

本文关键字:对话框 消息 单元测试 WPF | 更新日期: 2023-09-27 18:06:03

我正在用MVVM编写一个应用程序,到目前为止效果很好。但是我正在做的工作在ViewModel引发了一个错误,我想显示给用户让他们知道。

可以在我的ViewModel (VM)中做这样的事情:

MessageBox.Show(errorMessage);

或者更可能是:

new ErrorMessageWindow(errorMessage).ShowDialog()

所以我可以给它设置样式

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

寻找一个好的方法。

我正在考虑在VM中引发一个事件-但是由于视图确实不知道VM或其属性,我不知道如何订阅它。

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

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

我通常为视图模型提供了一种表示需要引发错误的方法。你可以通过依赖注入、传递给构造函数等方式来实现。实现由包含应用程序或绑定视图提供。

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

您应该针对抽象工作,以便您可以在单元测试期间交换出实现。

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

你真的应该考虑使用MVVM框架,比如Caliburn。Micro已经有了IWindowManager接口

我建议您不要使用传统的Win32 dialogs。如果有的话,最好是在WPF中完成对话框,并使用例如绑定到bool的对话框来从ViewModel中引发对话框。这将很容易测试,因为您甚至不需要创建Window Manager的模拟类。

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

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