8

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

从 UnitTest 中获取这些事件的合理方法是什么?例如,我想模拟 drop 事件。我真的不想建立一个存根视图,只是为了引发事件。

欢迎任何建议。

谢谢。

4

4 回答 4

18

根据 MVVM 模式:

  • View 知道 ViewModel - 它将作为具体实例或接口引用它
  • 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 行!

于 2009-03-11T22:51:42.487 回答
1

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

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

于 2009-03-11T21:29:31.063 回答
0

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

于 2009-07-08T15:48:42.383 回答
0

不要引发事件,只需调用处理程序(这意味着它们应该是公共的,并且可能需要更少的以事件处理程序为中心的参数)。查看如何使用“操作”在 Caliburn ( http://www.codeplex.com/caliburn ) 中完成此操作。

于 2009-03-20T12:58:56.360 回答