【发布时间】:2012-07-12 23:37:35
【问题描述】:
我刚看完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();
}
}
因此,如果我对 ViewModel 的 FooBar 功能进行单元测试,我可以通过调用 testVM.FooBar() 或通过调用 testVM.FooBarCommand.Execute() 来执行命令来运行 FooBar()。哪个是首选?我倾向于测试 FooBarCommand 属性,因为最终视图上的按钮被绑定到 FooBarCommand 属性而不是 FooBar() 方法。
此外,由于我的 View 将绑定到 IViewModel 而不是 ViewModel,我应该能够从 IViewModel 接口中省略 FooBar() 方法完全正确吗?
【问题讨论】:
-
如果你想对你的视图模型进行单元测试,你应该用 IMessageboxService 替换 System.Windows.MessageBox.Show 否则你会遇到麻烦;)
-
哦,是的,我知道我在制作示例时并没有考虑到这一点。我现在在问题中解决了它。
-
从界面中删除 FooBar 方法是对的。该方法和 CanExecute 方法实际上可以是内部的。如果您开始测试方法与命令,这与测试类的私有实现与公共“接口”没有什么不同,因为视图模型的使用者仅使用命令。
标签: .net wpf mvvm viewmodel view-model-pattern