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() メソッドを完全に省略できるはずです。