【发布时间】:2023-03-17 11:03:01
【问题描述】:
我一直在开发 WPF 应用程序,并且正在使用 ModelViewViewModel 设计模式。我有许多来自视图的事件,这些事件导致 ViewModel 活动。
从 UnitTest 中获取这些事件的合理方法是什么?例如,我想模拟 drop 事件。我真的不想构建存根视图,只是为了引发事件。
欢迎提出任何建议。
谢谢。
【问题讨论】:
标签: wpf unit-testing mvvm
我一直在开发 WPF 应用程序,并且正在使用 ModelViewViewModel 设计模式。我有许多来自视图的事件,这些事件导致 ViewModel 活动。
从 UnitTest 中获取这些事件的合理方法是什么?例如,我想模拟 drop 事件。我真的不想构建存根视图,只是为了引发事件。
欢迎提出任何建议。
谢谢。
【问题讨论】:
标签: wpf unit-testing mvvm
根据 MVVM 模式:
如果您需要处理事件,那么我知道有两种方法可以做到:
1: 在您的视图模型中公开一个命令,并使用数据绑定来触发它。这是我的首选方式,例如:
class MyViewModel
{
public ICommand ClickCommand { get; set; }
}
<Button Command="{Binding Path=ClickCommand}" />
如果您这样做,那么您只需手动调用myViewModel.ClickCommand.Execute 即可测试该命令。
2: 在viewmodel中暴露一个函数,并在.xaml.cs文件中写入绝对最小值来处理事件并调用函数,例如: p>
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 代码分开。
【讨论】:
不要引发事件,只需调用处理程序(这意味着它们应该是公共的,并且可能需要更少的以事件处理程序为中心的参数)。看看这是如何在 Caliburn (http://www.codeplex.com/caliburn) 中使用“Actions”完成的。
【讨论】:
为什么不使用模拟框架,例如Moq?查看他们的快速入门,它有一个关于模拟事件的示例。网址为:http://code.google.com/p/moq/wiki/QuickStart
【讨论】: