【问题标题】:WPF coded UI test doesn't trigger the change of bound propertyWPF 编码的 UI 测试不会触发绑定属性的更改
【发布时间】:2019-02-20 16:05:15
【问题描述】:

我有一个 WPF 视图并以编程方式在其上创建一个单选按钮:

// public class MyView
var radioButton = new RadioButton
{
    Name = "NameGoesHere",
    Content = "Use alternative option",
    FontWeight = FontWeights.Bold,
    IsChecked = false
};
radioButton.SetBinding(ToggleButton.IsCheckedProperty, new Binding("UseAlternativeOption")
{
    Converter = new CustomNullableBoolConverter(),
    ConverterParameter = true,
    Mode = BindingMode.TwoWay
});
panel.Children.Add(radioButton);

这个单选按钮有一个双向绑定到我的视图模型中的一个属性:

// public class MyViewModel
public bool? UseAlternativeOption
{
    get
    {
        return _useAlternativeOption;
    }
    set
    { // breakpoint here is not being hit when updated from automated UI test scenario
        _useAlternativeOption = value ?? false;
        OnPropertyChanged(nameof(UseAlternativeOption));
    }
}

现在,当我在应用程序中单击此单选按钮时,它会正确调用属性设置器并设置值。

问题是当我尝试从编码的 UI 测试中做同样的事情时它不起作用:

// public class MyUnitTests
var alternativeOptionRadioButton = UIControlBuilder<WpfRadioButton>.Builder()
    .Parent(ContentPane)
    .AutomationID(AlternativeOptionRadioButtonAutomationID)
    .Build();

alternativeOptionRadioButton.Selected = true;
Assert.AreEqual(true, viewModel.UseAlternativeOption);

我看到表单上的单选按钮被选中,并且可以看到Selected 属性是true,但是没有点击视图模型设置器。我在_useAlternativeOption = value ?? false 行上放了一个断点,它没有被命中,而在 UI 测试场景之外运行并手动单击时它被命中。

我有什么遗漏吗?
如何让 RadioButton 在自动化 UI 测试场景中触发其Binding 的变化?

【问题讨论】:

  • 顺便说一下,OnClick 事件在用户交互和自动化 UI 测试场景中都会被触发,因此肯定会单击单选按钮。
  • 您确定调试器连接到正确的进程吗?运行编码 UI 测试的进程可能与实际应用程序进程不同。如果您只是尝试调试编码的 UI 测试,则不会在实际应用程序中遇到任何断点,除非您还附加到该进程。
  • @DaveM 这很有意义。实际上,模型正在正确更新,但我只是没有意识到我实际上是在调试 UI 测试,而不是在测试中的应用程序。谢谢。您可以将其作为答案发布,以便它可以帮助其他偶然发现此问题的开发人员:)

标签: c# wpf testing coded-ui-tests


【解决方案1】:

编码的 UI 测试在与被测应用程序不同的进程中运行。因此,请确保您的调试器实际上已附加到正确的进程。除非您还将调试器附加到该进程,否则您不会在应用程序代码中遇到任何断点。

要在 Visual Studio 2017 中执行此操作,请转到 Debug > Attach To Process... 并选择被测应用程序的进程。

【讨论】:

    【解决方案2】:

    尝试使用 {SPACE} 键执行 SendKeys,而不是设置 true/false 值。如果空间不起作用,请尝试 {ENTER}。我希望这能让你度过难关。

    if(!alternativeOptionRadioButton.Selected)
    {
        Keyboard.SendKeys(alternativeOptionRadioButton, "{SPACE}");
    }
    

    【讨论】:

    • 感谢您的回答。实际上,问题在于我确实混淆了我实际上并没有调试我的应用程序并且编码的 UI 测试在不同的进程中运行这一事实。
    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多