Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wpfmvvm与单元测试_Wpf_Unit Testing_Mvvm - Fatal编程技术网

wpfmvvm与单元测试

wpfmvvm与单元测试,wpf,unit-testing,mvvm,Wpf,Unit Testing,Mvvm,我一直在开发一个WPF应用程序,我正在使用ModelViewModel设计模式。我有许多来自视图的事件,它们导致ViewModel活动 从单元测试中引发这些事件的合理方法是什么?例如,我想模拟drop事件。我真的不想构建存根视图,只是为了引发事件 欢迎任何建议 谢谢。听起来好像您在ViewModel类中直接为drop事件提供了一个事件处理程序。将处理程序放在UI层中会更有意义吗?UI层将调用ViewModel中的函数?这样,单元测试就可以调用函数(就ViewModel而言,模拟拖放操作) 另外,

我一直在开发一个WPF应用程序,我正在使用ModelViewModel设计模式。我有许多来自视图的事件,它们导致ViewModel活动

从单元测试中引发这些事件的合理方法是什么?例如,我想模拟drop事件。我真的不想构建存根视图,只是为了引发事件

欢迎任何建议


谢谢。

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


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

根据MVVM模式:

  • 视图了解ViewModel—它将引用它作为具体实例或接口
  • ViewModel根本不应该知道视图
如果需要处理事件,我知道有两种方法:

1:在viewmodel中公开命令,并使用数据绑定触发该命令。这是我喜欢的方式,例如:

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

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

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

不要引发事件,只需调用处理程序(这意味着它们应该是公共的,并且可能采用较少的以事件处理程序为中心的参数)。请查看Caliburn()中如何使用“操作”来实现这一点。

为什么不使用模拟框架,例如
Moq
?看看他们的快速入门,它有一个模拟事件的示例。网址是:

class MyViewModel
{
    public void HandleClick(){ }
}

<Button Click="MyClickHandler">

//.xaml.cs file
public void MyClickHandler( Object sender, EventArgs e ) {
    m_viewModel.HandleClick()
}