我一直在开发 WPF 应用程序,并且正在使用 ModelViewViewModel 设计模式。我有许多来自视图的事件,这些事件导致 ViewModel 活动。
从 UnitTest 中获取这些事件的合理方法是什么?例如,我想模拟 drop 事件。我真的不想建立一个存根视图,只是为了引发事件。
欢迎任何建议。
谢谢。
我一直在开发 WPF 应用程序,并且正在使用 ModelViewViewModel 设计模式。我有许多来自视图的事件,这些事件导致 ViewModel 活动。
从 UnitTest 中获取这些事件的合理方法是什么?例如,我想模拟 drop 事件。我真的不想建立一个存根视图,只是为了引发事件。
欢迎任何建议。
谢谢。
根据 MVVM 模式:
如果您需要处理事件,那么我知道有两种方法可以做到:
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 类中有一个用于放置事件的事件处理程序。在你的 UI 层中有处理程序是否更有意义,这反过来又会在你的 ViewModel 中调用一个函数?这样,您的单元测试可以只调用该函数(就 ViewModel 而言,模拟拖放操作)。
另外,最好将您的 ViewModel 与您的 UI 代码分开。
Why don't you use a mocking framework, such as Moq
? Check out their quick start, it has a sample on mocking events. The url is: http://code.google.com/p/moq/wiki/QuickStart
不要引发事件,只需调用处理程序(这意味着它们应该是公共的,并且可能需要更少的以事件处理程序为中心的参数)。查看如何使用“操作”在 Caliburn ( http://www.codeplex.com/caliburn ) 中完成此操作。