Глазное яблоко.
Этот вид декларативной разметки редко ломается .. если кто-то не идет в руководство и не испортит Даже тогда вы можете исправить это в течение нескольких минут. ИМХО стоимость написания таких тестов намного перевешивает преимущества.
Обновление [Dec3,08]: Тогда хорошо.
Этот тест просто проверяет, что текстовое поле имеет значение «FirstName» в качестве свойства Path привязки. Если я изменю / реорганизую FirstName на JustName в фактическом объекте источника данных, тест все равно пройдет, так как он проверяет анонимный тип. (Зеленый тест, когда код нарушен - TDD Antipattern: Лжец)
Если ваша цель состоит в том, чтобы проверить, что FirstName было указано в XAML,
Assert.AreEqual("FirstName", txtBoxToProbe.GetBindingExpression(TextBox.TextProperty).ParentBinding.Path.Path);
Если вы действительно должны отследить нарушенные привязки с помощью модульных тестов (и не хотите показывать пользовательский интерфейс), используйте реальный источник данных ... некоторое время боролись и пришли к этому.
[Test]
public void TestTextBoxBinding()
{
MyWindow w = new MyWindow();
TextBox txtBoxToProbe = w.TextBox1;
Object obDataSource = w; // use 'real' data source
BindingExpression bindingExpr = BindingOperations.GetBindingExpression(txtBoxToProbe, TextBox.TextProperty);
Binding newBind = new Binding(bindingExpr.ParentBinding.Path.Path);
newBind.Source = obDataSource;
txtBoxToProbe.SetBinding(TextBox.TextProperty, newBind);
Assert.AreEqual("Go ahead. Change my value.", txtBoxToProbe.Text);
}
Эпилог:
* * * * * * * * * * * * * * * * * * * * * * * - * * * - ). Он каким-то волшебным образом настраивает свойство DataItem, после чего привязка данных начинает работать.
// before show
bindingExpr.DataItem => null
bindingExpr.Status => BindingStatus.Unattached
// after show
bindingExpr.DataItem => {Actual Data Source}
bindingExpr.Status => BindingStatus.Active
Как только привязка активна, я думаю, вы можете принудительно обновлять текстовые поля с помощью кода, подобного этому.
txtBoxToProbe.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
Еще раз я выражаю свое нежелание против такого подхода. Получить NUnit для запуска в STA было больно ..