Rhino模拟和WPF窗口对话框
我正在为MvvM场景中的OK_Execute命令编写单元测试 现在,在方法调用之前,这一切正常:Rhino模拟和WPF窗口对话框,wpf,unit-testing,modal-dialog,rhino-mocks,Wpf,Unit Testing,Modal Dialog,Rhino Mocks,我正在为MvvM场景中的OK_Execute命令编写单元测试 现在,在方法调用之前,这一切正常: obj.DialogResult = !datumExistiertBereits || datumUeberschreiben; obj.Close(); 其中第一行触发以下InvalidOperationException: 只有在创建窗口并显示为对话框后,才能设置DialogResult 现在我想知道如何让我的窗口存根对象负责这些调用,而不在单元测试中真正
obj.DialogResult = !datumExistiertBereits || datumUeberschreiben;
obj.Close();
其中第一行触发以下InvalidOperationException:
只有在创建窗口并显示为对话框后,才能设置DialogResult
现在我想知道如何让我的窗口存根对象负责这些调用,而不在单元测试中真正显示对话框
提前谢谢
Steav您需要将显示实际对话框(或任何窗口)的职责转移到一个单独的类,该类实现一个接口,并且只将该类的一个实例交给使用它的VM 例如:
interface IDialogService
{
Result ShowDialog();
}
class ViewModel
{
ViewModel( IDialogService dlgService ) { ... }
void ExecuteSomeCommand()
{
var result = dlgService.ShowDialog();
}
}
//actual code
class ActualDialog : IDialogService { ... }
var vm = new ViewModel( new ActualDialog() );
//test pseudocode (sorry I don't know RhinoMock)
var vm = new ViewModel( RhinoMock.GetMeAMockFor<IDialogService>() );
接口IDialogService
{
结果显示对话框();
}
类视图模型
{
ViewModel(IDialogService dlgService){…}
void ExecuteSomeCommand()
{
var result=dlgService.ShowDialog();
}
}
//实际代码
类ActualDialog:IDialogService{…}
var vm=new ViewModel(new ActualDialog());
//测试伪代码(对不起,我不知道)
var vm=newviewmodel(RhinoMock.GetMeAMockFor());
您可以很容易地看到它的优点:vm对对话框一无所知,不再依赖于显示/关闭窗口的代码,而且您可以通过模拟对话框服务来测试代码