我正在MVVM中编写一个应用程序,迄今为止效果很好。 但我正在ViewModel中工作,它会引发一个错误,我想向用户展示这个错误让他们知道。
我可以在我的ViewModel(VM)中执行类似的操作:
MessageBox.Show(errorMessage);
或者更可能是这样的:
new ErrorMessageWindow(errorMessage).ShowDialog()
所以我可以设计它。
问题是我正在从VM创建一个UI弹出窗口。 我正在为应用程序创建单元测试,它也会弹出窗口并停止运行,直到它被手动关闭。
寻找一个好的方法。
我正在考虑在VM中引发一个事件 - 但由于View真的不知道VM或其属性,我不知道如何订阅它。
我没有使用任何外部框架 - 我宁愿自己实现任何东西。
答案 0 :(得分:4)
我一般为viewmodel提供了一种方式来表示它需要引发错误。您可以通过依赖注入,将其传递给构造函数等来完成此操作。实现由包含应用程序或绑定视图提供。
当您进行测试时,您将传递“显示错误消息”功能的测试实现,该功能仅验证是否已调用它以及是否请求了正确的错误消息。理想情况下,您将viewmodel限制为将格式字符串的资源名称和参数数组传递给它,以便它也适用于国际化。
答案 1 :(得分:3)
你应该反对抽象,以便在单元测试期间交换实现。
例如,您可以使用IWindowManager
方法使用ShowDialog
方法,然后使用一个调用MessageBox
的实现(或生产期间您需要的任何技术),然后您就可以使用隔离框架或为单元测试创建测试实现,它将您想要的结果作为控制变量返回到测试中。
您真的应该考虑using an MVVM framework,Caliburn.Micro之类的内容已经有IWindowManager
接口。
答案 2 :(得分:2)