Взгляните на это.
Такая декларативная разметка редко ломается ... если только кто-то не обратится к руководству и не испортит. Даже в этом случае вы можете исправить это за считанные минуты. ИМХО стоимость написания таких тестов намного перевешивает преимущества.
Обновление [3 декабря, 08]: Хорошо.
Тест просто проверяет, имеет ли текстовое поле значение "FirstName" в качестве свойства Path привязки. Если я изменю / реорганизую FirstName на JustName в фактическом объекте источника данных, тест все равно пройдет, поскольку он проверяет анонимный тип. (Зеленый тест при нарушении кода - TDD Antipattern: The Liar) Если ваша цель - убедиться, что 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);
}
Эпилог: есть несколько реальных скрытые вещи, происходящие в звонке Window.Show(). Он каким-то волшебным образом настраивает свойство 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 было непросто.
person
Gishu
schedule
01.12.2008