Eyeball it.
Этот вид декларативной разметки редко ломается. Если кто-то не входит в руководство и не закручивает его. Даже тогда вы можете исправить это в течение нескольких минут. ИМХО стоимость написания таких тестов намного превышает преимущества.
Обновление [Dec3,08]: Тогда же.
Тест просто проверяет, что текстовое поле имеет значение «FirstName» как свойство Path привязки. Если я изменяю/рефакторизую FirstName на JustName в фактическом объекте источника данных, тест все равно пройдет, поскольку он тестирует анонимный тип. (Зеленый тест, когда код сломана - TDD антипаттерн: Лжец) Если ваша цель состоит в том, чтобы убедиться, что 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);
}
Эпилог: Там какая-то real covert stuff происходит в вызове Window.Show()
. Это как-то волшебным образом устанавливает свойство DataItem, после которого начинает работать привязка данных.
// before show
bindingExpr.DataItem => null
bindingExpr.Status => BindingStatus.Unattached
// after show
bindingExpr.DataItem => {Actual Data Source}
bindingExpr.Status => BindingStatus.Active
После Binding активен, я думаю, вы можете заставить обновления TextBox с помощью кода, как это ..
txtBoxToProbe.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
Еще раз выразить свое нежелание против такого подхода. Получение NUnit для запуска в STA было больно.
Если мы являемся обязательными для свойств в классе, и реорганизовать класс, то XAML будет компилироваться, но исключение не будет выброшено и наше приложение не будет больше работать неправильно, как привязки будут некорректными. Это уже проблема для нас, поэтому мы ищем решение. – NotDan 2008-12-02 15:48:23