Eyeball it.
Este tipo de marcado declarativo rara vez se rompe ... a menos que alguien entre en manual y lo estropee. Incluso entonces, puedes arreglarlo en minutos. En mi humilde opinión, el costo de escribir tales pruebas supera con creces los beneficios.
Actualización [Dec3,08]: Bien entonces.
La prueba solo está probando que el cuadro de texto tiene el valor "Nombre" como la propiedad Ruta del enlace. Si cambio/refactorizo FirstName a JustName en el objeto de fuente de datos real, la prueba aún pasaría, ya que está probando contra un tipo anónimo. (Prueba de verde cuando el código roto - TDD antipatrón: The Liar) Si su objetivo es verificar que FirstName se ha especificado en XAML,
Assert.AreEqual("FirstName", txtBoxToProbe.GetBindingExpression(TextBox.TextProperty).ParentBinding.Path.Path);
Si realmente tiene que coger fijaciones rotas a través de pruebas de unidad (y no hacer quiere mostrar la IU), use la fuente de datos real ... luchó por un tiempo y se le ocurrió esto.
[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);
}
Epílogo: hay algo de real covert stuff ocurriendo en la llamada a Window.Show()
. De alguna manera mágicamente configura la propiedad DataItem después de la cual el enlace de datos comienza a funcionar.
// before show
bindingExpr.DataItem => null
bindingExpr.Status => BindingStatus.Unattached
// after show
bindingExpr.DataItem => {Actual Data Source}
bindingExpr.Status => BindingStatus.Active
Una vez que la unión es activo, supongo que se puede forzar cambios de cuadro de texto a través de un código como éste ..
txtBoxToProbe.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
Una vez más, la voz de mi renuencia contra de este enfoque. Hacer que NUnit se ejecute en STA fue una molestia ...
Si son vinculantes a las propiedades de una clase, y refactorizar la clase, la xaml todavía compilar, pero no es una excepción será lanzada y nuestra aplicación va a la función no más correctamente como las fijaciones será incorrecta. Esto ya ha sido un problema para nosotros y por eso estamos buscando una solución. – NotDan