Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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# 在基于mvvm prism的应用程序中使用moq的单元测试对话框弹出_C#_Wpf_Unit Testing_Mvvm - Fatal编程技术网

C# 在基于mvvm prism的应用程序中使用moq的单元测试对话框弹出

C# 在基于mvvm prism的应用程序中使用moq的单元测试对话框弹出,c#,wpf,unit-testing,mvvm,C#,Wpf,Unit Testing,Mvvm,我正在使用prism对mvvm应用程序中的视图模型进行单元测试。我使用moq对视图模型进行单元测试。我遇到了一个问题,我正在对一个方法进行单元测试,该方法本身调用另一个方法,并进一步调用一个弹出的密码对话框。因为我是单元测试的第一种方法,所以在函数返回之前,我无法控制对话框的弹出。此外,我还想对对话框是否弹出进行单元测试。我建议您通过编写一个精简的UI服务来测试VM,该服务将弹出窗口和对话框。这将使您获得可测试性(编写模拟服务对您来说很容易)和良好的总体设计方法,因为我们不使用视图模型来弹出窗口

我正在使用prism对mvvm应用程序中的视图模型进行单元测试。我使用moq对视图模型进行单元测试。我遇到了一个问题,我正在对一个方法进行单元测试,该方法本身调用另一个方法,并进一步调用一个弹出的密码对话框。因为我是单元测试的第一种方法,所以在函数返回之前,我无法控制对话框的弹出。此外,我还想对对话框是否弹出进行单元测试。

我建议您通过编写一个精简的UI服务来测试VM,该服务将弹出窗口和对话框。这将使您获得可测试性(编写模拟服务对您来说很容易)和良好的总体设计方法,因为我们不使用视图模型来弹出窗口(假设您希望在手机\平板电脑应用程序中重用vm)

这是一张草图:

        public interface IUIService   
        {   
            bool ShowPopUp(....);

            DialogResult ShowDialog(...);

            ..  
        }

是的,我们已经编写了一个静态类UIService类,它保存了对话框的所有实现,但是在视图模型方法中,我们调用了UIService方法,它将自身与xaml绑定,并尝试弹出dilaog。你认为这是错误的做法吗?如果不是,那么在单元测试时,我如何在方法内部抑制此调用。最好是使用依赖项注入,而不是使用静态类。第二个最好的方法是在视图模型的cto'r中使用接口(IUIService),启动接口的模拟实现,并将其提供给启动视图模型的用户。但是,在这种情况下,依赖项注入是经典的。如果我们不想重构代码,因为我们对第三方代码有很多依赖,同时也为了避免构造函数泛滥,该怎么办。使用moq或任何其他技术测试这些类型的场景是否有任何解决方法。我看不到不修改代码就能抑制弹出窗口的方法。这正是为什么使用服务是一个好方法的原因,以避免类似的情况。。