1

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

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

MessageBox.Show(errorMessage);

或更可能是这样的:

new ErrorMessageWindow(errorMessage).ShowDialog()

所以我可以设计它。

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

寻找一个好的方法。

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

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

4

3 回答 3

4

我通常为 viewmodel 提供了一种方法来表明它需要引发错误。您可以通过依赖注入、将其传递给构造函数等来做到这一点。实现由包含应用程序或绑定视图提供。

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

于 2013-03-27T16:00:02.457 回答
3

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

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

你真的应该考虑使用 MVVM 框架,像Caliburn.Micro这样的东西已经有了一个IWindowManager接口。

于 2013-03-27T16:01:08.647 回答
2

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

此处提供了有关如何在 WPF 中制作自己的弹出对话框的简单示例。

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

于 2013-03-27T16:00:35.250 回答