Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF&;MVVM-单元测试和弹出消息框或对话框_C#_Wpf_Mvvm - Fatal编程技术网

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

C# WPF&;MVVM-单元测试和弹出消息框或对话框,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在用MVVM编写一个应用程序,迄今为止效果良好。 但是我在ViewModel中做的工作会引起一个错误,我想向用户展示这个错误,让他们知道 我可以在我的ViewModel(VM)中执行类似的操作: 或者更可能类似于: new ErrorMessageWindow(errorMessage).ShowDialog() 所以我可以设计它 问题是我正在从VM创建一个UI弹出窗口。 我正在为应用程序创建单元测试,它也会弹出窗口并停止运行,直到手动关闭为止 寻找一个好的方法 我曾考虑在VM中引发一个事

我正在用MVVM编写一个应用程序,迄今为止效果良好。 但是我在ViewModel中做的工作会引起一个错误,我想向用户展示这个错误,让他们知道

我可以在我的ViewModel(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()