WPF MVVM和单元测试

8

我一直在开发一个WPF应用程序,使用ModelViewViewModel设计模式。我的视图中有许多事件,这些事件会导致ViewModel的活动。

那么,在单元测试中如何合理地触发这些事件呢?例如,我想模拟drop事件。我不想构建一个存根视图,只是为了触发该事件。

欢迎任何建议。

谢谢。

4个回答

18

根据MVVM模式:

  • 视图(View)知道视图模型(ViewModel)- 它将引用它作为具体实例或接口。
  • 视图模型不应该知道任何关于视图的信息。

如果需要处理事件,那么我知道的有两种方法:

1:在你的视图模型中公开一个命令,并使用数据绑定来触发它。这是我的首选方式,例如:

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

<Button Command="{Binding Path=ClickCommand}" />

如果这样做,您可以通过手动调用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()
}

如果你这样做,那么你可以通过手动调用myViewModel.HandleClick来进行测试。你不需要费心去进行单元测试MyClickHandler代码,因为它只有一行!

1

听起来你在ViewModel类中直接为drop事件设置了事件处理程序。将处理程序放在UI层中,然后调用ViewModel中的函数会更有意义吗?这样,您的单元测试只需调用该函数(就ViewModel而言,模拟拖放操作即可)。

此外,这将更好地将您的ViewModel与UI代码分离。


0

0
不要触发事件,只需调用处理程序(这意味着它们应该是公共的,并且可能需要较少的事件处理程序参数)。请查看Caliburn中如何使用“Actions”来实现此功能(http://www.codeplex.com/caliburn)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接