WPF编码的UI测试不会触发绑定属性的更改

时间:2019-02-20 16:05:16

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

我有一个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,但是未单击viewmodel setter。我在_useAlternativeOption = value ?? false行上放置了一个断点,但没有命中该断点,而在UI测试场景之外运行并手动单击时却被命中。

我想念什么吗?
如何在自动UI测试场景中使RadioButton触发其Binding的更改?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

请尝试使用{SPACE}键执行SendKey,而不是设置true / false值。如果空格不起作用,请尝试按{ENTER}。我希望这能使您通过。

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