2

MvvM-ScenarioでOK_Executeコマンドの単体テストを書いています。

これで、メソッドが呼び出すまでは正常に機能しています。

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

ここで、最初の行は次のInvalidOperationExceptionを発生させます。

DialogResultは、ウィンドウが作成されてダイアログとして表示された後にのみ設定できます。

ユニットテストでダイアログを実際に表示せずに、ウィンドウスタブオブジェクトでこれらの呼び出しを実行するにはどうすればよいでしょうか。

前もって感謝します

Steav

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 に答える