WPF MVVM和单元测试

jef*_*eff 6 wpf unit-testing mvvm

我一直在研究WPF应用程序,我正在使用ModelViewViewModel设计模式.我有一些来自视图的事件,导致ViewModel活动.

从UnitTest获得这些事件的合理方法是什么?例如,我想模拟drop事件.我真的不想构建一个存根视图,只是为了提升事件.

欢迎任何建议.

谢谢.

Ori*_*rds 17

根据MVVM模式:

  • View了解ViewModel - 它将作为具体实例或接口引用它
  • ViewModel根本不应该知道视图.

如果你需要处理事件,那么我知道有两种方法可以做到:

1:   在viewmodel中显示一个命令,并使用数据绑定来触发它.这是我的首选方式,例如:

class MyViewModel
{
    public ICommand ClickCommand { get; set; }
}

<Button Command="{Binding Path=ClickCommand}" />
Run Code Online (Sandbox Code Playgroud)

如果执行此操作,则只需myViewModel.ClickCommand.Execute手动调用即可测试该命令.

2:   在viewmodel中公开一个函数,并在文件中写入绝对最小值.xaml.cs来处理事件并调用函数,例如:

class MyViewModel
{
    public void HandleClick(){ }
}

<Button Click="MyClickHandler">

//.xaml.cs file
public void MyClickHandler( Object sender, EventArgs e ) {
    m_viewModel.HandleClick()
}
Run Code Online (Sandbox Code Playgroud)

如果您这样做,那么您只需myViewModel.HandleClick手动调用即可进行测试.您不需要为单元测试MyClickHandler代码而烦恼,因为它只有1行!


And*_*ndy 1

听起来您的 ViewModel 类中直接有一个用于 drop 事件的事件处理程序。将处理程序放在 UI 层中(进而调用 ViewModel 中的函数)是否更有意义?这样,您的单元测试就可以调用该函数(就 ViewModel 而言,模拟拖放操作)。

另外,最好将 ViewModel 与 UI 代码分开。