C# WPF&;MVVM-单元测试和弹出消息框或对话框
我正在用MVVM编写一个应用程序,迄今为止效果良好。 但是我在ViewModel中做的工作会引起一个错误,我想向用户展示这个错误,让他们知道 我可以在我的ViewModel(VM)中执行类似的操作: 或者更可能类似于:C# WPF&;MVVM-单元测试和弹出消息框或对话框,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在用MVVM编写一个应用程序,迄今为止效果良好。 但是我在ViewModel中做的工作会引起一个错误,我想向用户展示这个错误,让他们知道 我可以在我的ViewModel(VM)中执行类似的操作: 或者更可能类似于: new ErrorMessageWindow(errorMessage).ShowDialog() 所以我可以设计它 问题是我正在从VM创建一个UI弹出窗口。 我正在为应用程序创建单元测试,它也会弹出窗口并停止运行,直到手动关闭为止 寻找一个好的方法 我曾考虑在VM中引发一个事
new ErrorMessageWindow(errorMessage).ShowDialog()
所以我可以设计它
问题是我正在从VM创建一个UI弹出窗口。
我正在为应用程序创建单元测试,它也会弹出窗口并停止运行,直到手动关闭为止
寻找一个好的方法
我曾考虑在VM中引发一个事件,但由于视图实际上不知道VM或其属性,我不知道如何订阅它
我没有使用任何外部框架-我宁愿自己实现任何东西。我通常为viewmodel提供了一种方法,表明它需要引发错误。您可以通过依赖项注入、将其传递给构造函数等来实现这一点。实现由包含应用程序或绑定视图提供
当您进行测试时,您将传入“ShowErrorMessage”功能的测试实现,该功能只验证是否调用了它以及它是否请求了正确的错误消息。理想情况下,您可以将viewmodel限制为向格式字符串传递资源名称和参数数组,这样它也可以与国际化一起工作。我通常为viewmodel提供了一种方法,表明它需要引发错误。您可以通过依赖项注入、将其传递给构造函数等来实现这一点。实现由包含应用程序或绑定视图提供
当您进行测试时,您将传入“ShowErrorMessage”功能的测试实现,该功能只验证是否调用了它以及它是否请求了正确的错误消息。理想情况下,您可以将viewmodel限制为向格式字符串传递资源名称和参数数组,这样它也可以与国际化一起工作。我建议您远离传统的
Win32对话框。如果有任何问题,最好在WPF中完成该对话框,并从ViewModel
将其提升,例如使用绑定到bool的对话框以实现可见性。这很容易测试,因为您甚至不需要创建窗口管理器的模拟类
这里有一个简单的例子,说明如何在WPF中创建自己的弹出对话框
您还可以使用对话框服务找到替代实现,以帮助您从ViewModel中移动对话框的创建。这允许您在单元测试期间模拟对话服务。我建议您远离传统的Win32对话。如果有任何问题,最好在WPF中完成该对话框,并从ViewModel
将其提升,例如使用绑定到bool的对话框以实现可见性。这很容易测试,因为您甚至不需要创建窗口管理器的模拟类
这里有一个简单的例子,说明如何在WPF中创建自己的弹出对话框
您还可以使用对话框服务找到替代实现,以帮助您从ViewModel中移动对话框的创建。这允许您在单元测试期间模拟对话服务。您应该使用抽象,以便在单元测试期间交换实现
例如,您可以有一个带有ShowDialog方法的iWindows Manager
接口,然后是一个调用MessageBox
的实现(或生产过程中需要的任何技术),然后,您可以使用一个隔离框架或为单元测试创建一个测试实现,单元测试将返回您想要的结果作为测试中的控制变量
您真的应该考虑一下,类似的东西已经有了一个IWindowManager
接口。您应该针对一个抽象进行工作,这样您就可以在单元测试期间交换实现
例如,您可以有一个带有ShowDialog方法的iWindows Manager
接口,然后是一个调用MessageBox
的实现(或生产过程中需要的任何技术),然后,您可以使用一个隔离框架或为单元测试创建一个测试实现,单元测试将返回您想要的结果作为测试中的控制变量
你真的应该考虑一下,像这样的东西已经有了一个IWindowManager
接口
new ErrorMessageWindow(errorMessage).ShowDialog()