2

我正在为 MvvM 场景中的 OK_Execute 命令编写单元测试。

现在一切正常,直到方法调用:

        obj.DialogResult = !datumExistiertBereits || datumUeberschreiben;
        obj.Close();  

其中第一行触发以下 InvalidOperationException:

DialogResult 只能在 Window 创建并显示为对话框后设置。

现在我想知道如何让我的窗口存根对象对这些调用负责而不在我的单元测试中真正显示对话框?

提前致谢

斯蒂夫

4

1 回答 1

3

您需要将显示实际对话框(或任何窗口)的责任转移到一个单独的类中,该类实现一个接口,并且只将该类的一个实例交给使用它的 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>() );

您可以很容易地看到它的优点:vm 对对话框一无所知,并且不再依赖于显示/关闭窗口的代码,而且您可以通过模拟对话框服务来测试代码。

于 2012-05-21T12:44:12.023 回答