【问题标题】:WPF MVVM and Unit TestingWPF MVVM 和单元测试
【发布时间】:2023-03-17 11:03:01
【问题描述】:

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

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

欢迎提出任何建议。

谢谢。

【问题讨论】:

    标签: wpf unit-testing mvvm


    【解决方案1】:

    根据 MVVM 模式:

    • View 知道 ViewModel - 它将作为具体实例或接口引用它
    • ViewModel 根本不应该知道视图。

    如果您需要处理事件,那么我知道有两种方法可以做到:

    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 行!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          为什么不使用模拟框架,例如Moq?查看他们的快速入门,它有一个关于模拟事件的示例。网址为:http://code.google.com/p/moq/wiki/QuickStart

          【讨论】:

            猜你喜欢
            • 2012-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-24
            • 1970-01-01
            • 2010-09-24
            相关资源
            最近更新 更多