【问题标题】:How can I write a test for a WPF Command binding?如何为 WPF 命令绑定编写测试?
【发布时间】:2009-09-16 20:21:12
【问题描述】:

我有一个“命令”类:

public static class MyCommands
{
    private static ICommand exitCommand = new RoutedCommand();

    public static ICommand ExitCommand { get { return exitCommand; } }
}

MainWindow.xaml.cs 中的代码隐藏:

private void BindCommands()
{
    this.CommandBindings.Add(new CommandBinding(MyCommands.ExitCommand, this.Exit));
}

private void Exit(object sender, ExecutedRoutedEventArgs e)
{
    Application.Current.Shutdown();
}

以及实现菜单栏的用户控件中的一些 XAML:

<MenuItem Header="_Exit"
          Command="{x:Static local:MyCommands.ExitCommand}"
          />

代码有效。我喜欢所涉及的一般模式,我想继续使用它。

不过,我也在努力追求其他一些目标,例如进行测试驱动开发以及通过单元测试和集成测试实现 100% 的覆盖率。我还希望 100% 符合 StyleCop 和 FxCop 警告。我被困在这里了。

按照 FxCop (Microsoft.Security:CA2109) 的建议,我的 MainWindow.Exit() 方法是私有的,但这意味着我不能直接从测试中调用它。我想我可以将其公开并禁止显示 FxCop 消息。或者我可以使用访问器。但是我倾向于不直接针对私有方法编写测试,尤其是在这种情况下,因为所做的只是测试方法而不是命令绑定本身。

我觉得必须有其他方法从我的测试代码中调用命令,以便我可以验证该命令是否按预期工作(除了手动测试)。有什么建议吗?

【问题讨论】:

    标签: c# wpf testing commandbinding


    【解决方案1】:

    我意识到这是一个老问题,但我想我会回答,以防它帮助其他人。

    您可以使用以下代码从代码隐藏中调用命令:

    ICommand command = ExitCommand;
    
    command.Execute();
    

    这将执行 Exit() 并且不需要访问器。这是你要找的吗?

    【讨论】:

    • 哇,现在我知道如何测试仅依赖于命令(由私有方法支持)的视图模型
    【解决方案2】:

    使用MVVM 等单独的表示模式将允许您测试大部分代码,包括命令背后的逻辑。然后视图变得大大简化并且对单元测试不太重要。我建议您阅读 MVVM 和相关模式。

    【讨论】:

    • 我的代码隐藏事件处理程序将主要是单行 - 简单的 UI 逻辑(如示例中所示)或模型代码上的 API 方法。我还计划使用注入依赖,这样我就可以模拟 Application.Current 之类的东西并验证 Shutdown() 是否被调用。但我不知道如何触发命令,以便我的事件处理程序在我的测试期间运行。就像我说的,我可以使用访问器来调用私有方法,但我真的很想使用命令系统来自动验证一切都正确连接在一起。
    猜你喜欢
    • 2015-02-16
    • 2016-05-07
    • 2012-11-30
    • 2023-03-05
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    相关资源
    最近更新 更多