我剛看完Jason Dolinger's video on MVVM,我想澄清一下如何正確設置和單元測試我的視圖模型的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();
}
}
所以,如果我的單元測試視圖模型()的FooBar的功能,我可以運行FooBar的通過調用testVM.FooBar()或通過調用testVM.FooBarCommand.Execute執行命令()。哪一個是首選?我傾向於測試FooBarCommand屬性,因爲最終視圖上的按鈕被綁定到FooBarCommand屬性而不是FooBar()方法。
此外,由於我的視圖將綁定到一個IViewModel而不是ViewModel,我應該能夠從IViewModel接口中省略FooBar()方法完全正確嗎?
,如果你想你的單元測試視圖模型,你應該有一個IMessageboxService取代System.Windows.MessageBox.Show否則你就有麻煩了;) – blindmeis 2012-07-13 07:07:48
哦,是的,我知道我沒有想到的是,當我做了例子。我現在解決了這個問題。 – 2012-07-13 19:34:26
關於從界面中消除FooBar方法是正確的。該方法和CanExecute方法實際上可以是內部的。如果您開始測試方法與命令,那麼與測試類的私有實現與公共「接口」沒有什麼不同,因爲視圖模型的使用者只能使用該命令。 – Rich 2012-07-13 19:50:59