1

MVVM で Jason Dolinger のビデオを見終わったところです。ビュー モデルの ICommand プロパティを適切にセットアップして単体テストする方法を明確にしたいと思います。

FooBarCommand ICommandProperty を持つ次の ViewModel クラスを検討してください。

public class ViewModel : IViewModel
{
    public ICommand FooBarCommand { get; private set; }

    public bool CanExectuteFooBar()
    {
        return true;
    }

    public void FooBar()
    {
        //Do some FooBarish stuff
    }
}

public interface IViewModel
{
    void FooBar();
    System.Windows.Input.ICommand FooBarCommand { get; }
}

public class FooBarCommand : ICommand
{
    private ViewModel vm;

    public FooBarCommand(ViewModel vm)
    {
        this.vm = vm;
    }
    public bool CanExecute(object parameter)
    {
        return vm.CanExectuteFooBar();
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        vm.FooBar();
    }
}

したがって、ViewModel の FooBar 機能を単体テストする場合、testVM.FooBar() を呼び出すか、testVM.FooBarCommand.Execute() を呼び出してコマンドを実行することで、FooBar() を実行できます。どちらが好ましいですか?最終的にビューのボタンは FooBar() メソッドではなく FooBarCommand プロパティにバインドされるため、私は FooBarCommand プロパティのテストに傾いています。

さらに、View は ViewModel ではなく IViewModel にバインドされるため、IViewModel インターフェイスから FooBar() メソッドを完全に省略できるはずです。

4

2 に答える 2

0

DelegateCommand や RelayCommand を使用しないのはなぜですか? そうするなら、この質問をする必要はありません。なぜなら、Comand 自体が公開されているからです。その場合、canexecute および execute メソッドは非公開です。

公開されているものをユニットテストするだけです。

ps: あなたの質問に対する私のコメントを見逃さないでください。ビューモデルで MessageBox の代わりに IMessageBoxService を直接使用してください。

于 2012-07-13T07:11:04.583 に答える
0

場合によっては、コマンドの背後にロジック (有効無効ボタン) があるため、コマンドのテストが別のテスト フィクスチャになる可能性があります。メソッドで true のみを返す場合CanExecute、コマンドを単体テストする必要はありませんが、無効化/有効化ボタンに複雑なロジックが含まれている場合は、別のフィクスチャでテストする必要があります。

注(同意しない場合は無視してください):

  1. VM をコマンドに渡すよりもリレー コマンドを使用してみてください。循環参照を最小限に抑えることが常にベスト プラクティスです。
  2. テスト不可能なオブジェクトを VM に参照しないでください(ビュー - メッセージボックス、複雑な依存関係ツリーを持つ大きなオブジェクトなどを含む)。
于 2012-07-13T07:13:29.883 に答える