В настоящее время я пытаюсь выяснить, как автоматизировать тестирование пользовательского интерфейса для моего приложения WPF, и у меня возникли проблемы с его работой.UI автоматизации тестирования элементов управления WPF, кажется, игнорирует привязки
Часть XAML из MyControl
(который простирается UserControl
) содержит следующие CheckBox
:
<CheckBox Name="IsFooCheckBox"
IsChecked="{Binding Path=IsFoo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
связывания указывает на контекст данных пользовательского, который реализует INotifyPropertyChanged
и который содержит следующее свойство:
private bool _isFoo;
public bool IsFoo
{
get { return _isFoo; }
set
{
_isFoo = value;
OnPropertyChanged("IsFoo");
}
}
Связывание работает в процессе производства (в отладчике можно увидеть, что _isFoo
обновляется всякий раз, когда я переключаю флажок).
Теперь я хочу пройти тест, который переключает флажок и проверяет, что контекст данных обновлен (или для проверки логики, реализованной в коде). Структура WPF UI Automation, кажется, именно то, что я ищу, так что я написал следующий NUnit тест:
var myContext = ...
var sut = new MyControl
{
DataContext = myContext
};
var peer = new CheckBoxAutomationPeer(sut.IsFooCheckBox);
var pattern = peer.GetPattern(PatternInterface.Toggle) as IToggleProvider;
pattern.Toggle();
Assert.That(sut.IsProvidingProfileCheckBox.IsChecked.Value); // works
Assert.That(myContext.IsFoo); // fails
В то время как первые Assert
проходов второго один выходит из строя. Я не понимаю, почему это происходит ... кажется, что привязка в файле XAML игнорируется или что обновление не запускается. Есть ли у кого-нибудь предложение, как исправить мой тест? Возможно ли это?
Я не понимаю часть «вместо _isFoo, она возвращает _IsFoo» ... Я предполагаю, что это опечатка, но даже если это должно быть «IsFoo», я не понимаю ... значение ' _isFoo' устанавливается перед вызовом OnPropertyChange. Почему это должно быть проблемой? Как я уже сказал, элемент управления работает в пользовательском интерфейсе, он просто не работает в тесте. (И побочная заметка, которая не связана с вопросом: использование [CallerMemberName] - хорошая идея, но я должен оставаться совместимым с .net 4.0, поэтому я не могу использовать его ...) – Seb
Только что понятная опечатка уже существует в вопрос ... извините, я отредактировал это сейчас. – Seb
Он вызывается OnPropertyChanged, затем в свою очередь был вызван getter, который возвращает unset IsFoo = false, а false отправлен в CheckBox, и поскольку он был проверен, но получил false, свойство было изменено и еще один вызов времени был вызван. Он все еще не работает? – Maximus