WPF 编码 UI 测试不会触发绑定 属性 的更改
WPF coded UI test doesn't trigger the change of bound property
我有一个 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));
}
}
现在,当我在应用程序中单击此单选按钮时,它会正确调用 属性 setter 并设置值。
问题是当我尝试从编码 UI 测试做同样的事情时它不起作用:
// public class MyUnitTests
var alternativeOptionRadioButton = UIControlBuilder<WpfRadioButton>.Builder()
.Parent(ContentPane)
.AutomationID(AlternativeOptionRadioButtonAutomationID)
.Build();
alternativeOptionRadioButton.Selected = true;
Assert.AreEqual(true, viewModel.UseAlternativeOption);
我看到单选按钮在表单上被选中并且可以看到 Selected
属性 是 true
,但是视图模型 setter 没有被点击。我在 _useAlternativeOption = value ?? false
行上放置了一个断点,它没有被击中,而当 运行 在 UI 测试场景之外并手动单击时它被击中。
有什么我遗漏的吗?
如何让 RadioButton 在自动 UI 测试场景中触发其 Binding
的变化?
不要设置 true/false 值,而是尝试使用 {SPACE} 键执行 SendKeys。如果 space 不起作用,请尝试 {ENTER}。我希望这能让你度过难关。
if(!alternativeOptionRadioButton.Selected)
{
Keyboard.SendKeys(alternativeOptionRadioButton, "{SPACE}");
}
编码 UI 测试 运行 在与被测应用程序不同的进程中。因此,请确保您的调试器确实连接到正确的进程。除非您还将调试器附加到该进程,否则您不会在应用程序代码中遇到任何断点。
要在 Visual Studio 2017 年执行此操作,请转到 Debug
> Attach To Process...
和 select 正在测试的应用程序的进程。
我有一个 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));
}
}
现在,当我在应用程序中单击此单选按钮时,它会正确调用 属性 setter 并设置值。
问题是当我尝试从编码 UI 测试做同样的事情时它不起作用:
// public class MyUnitTests
var alternativeOptionRadioButton = UIControlBuilder<WpfRadioButton>.Builder()
.Parent(ContentPane)
.AutomationID(AlternativeOptionRadioButtonAutomationID)
.Build();
alternativeOptionRadioButton.Selected = true;
Assert.AreEqual(true, viewModel.UseAlternativeOption);
我看到单选按钮在表单上被选中并且可以看到 Selected
属性 是 true
,但是视图模型 setter 没有被点击。我在 _useAlternativeOption = value ?? false
行上放置了一个断点,它没有被击中,而当 运行 在 UI 测试场景之外并手动单击时它被击中。
有什么我遗漏的吗?
如何让 RadioButton 在自动 UI 测试场景中触发其 Binding
的变化?
不要设置 true/false 值,而是尝试使用 {SPACE} 键执行 SendKeys。如果 space 不起作用,请尝试 {ENTER}。我希望这能让你度过难关。
if(!alternativeOptionRadioButton.Selected)
{
Keyboard.SendKeys(alternativeOptionRadioButton, "{SPACE}");
}
编码 UI 测试 运行 在与被测应用程序不同的进程中。因此,请确保您的调试器确实连接到正确的进程。除非您还将调试器附加到该进程,否则您不会在应用程序代码中遇到任何断点。
要在 Visual Studio 2017 年执行此操作,请转到 Debug
> Attach To Process...
和 select 正在测试的应用程序的进程。