Augapfel es.
Diese Art von deklarativen Markup bricht selten .. es sei denn, jemand geht in das Handbuch und verschraubt es. Selbst dann können Sie es innerhalb von Minuten beheben. IMHO die Kosten für das Schreiben solcher Tests bei weitem überwiegen die Vorteile.
Aktualisieren [Dec3,08]: Alrighty dann.
Der Test testet gerade, dass das Textfeld den Wert "FirstName" als Path-Eigenschaft der Bindung hat. Wenn ich FirstName im tatsächlichen Datenquellenobjekt in JustName ändere/umgestalte, würde der Test noch bestehen, da er mit einem anonymen Typ getestet wird. (Grün-Test, wenn der Code gebrochen - TDD Antipattern: Der Lügner) Wenn Ihr Ziel zu überprüfen ist, dass First in XAML festgelegt wurde,
Assert.AreEqual("FirstName", txtBoxToProbe.GetBindingExpression(TextBox.TextProperty).ParentBinding.Path.Path);
Wenn Sie wirklich gebrochen Bindungen über Unit-Tests fangen müssen (und dies nicht tun will die UI zeigen), nutze die echte Datenquelle ... kämpfte eine Weile und kam dabei auf.
[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);
}
Epilog: Es gibt einige real covert stuff-Window.Show()
im Aufruf geschieht. Es stellt irgendwie magisch die Eigenschaft DataItem ein, nach der Datenbindung anfängt zu arbeiten.
// before show
bindingExpr.DataItem => null
bindingExpr.Status => BindingStatus.Unattached
// after show
bindingExpr.DataItem => {Actual Data Source}
bindingExpr.Status => BindingStatus.Active
Sobald die Bindung aktiv ist, ich denke, Sie Textbox-Updates über Code wie diese zwingen kann ..
txtBoxToProbe.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
Noch einmal, ich meine Abneigung gegen diesen Ansatz äußern. NUnit in STA laufen zu lassen, war ein Schmerz.
Wenn wir Eigenschaften in einer Klasse sind verbindlich, und die Klasse Refactoring wird die XAML noch kompilieren, aber keine Ausnahme wird geworfen und unsere App wird nicht mehr richtig funktionieren, da die Bindungen nicht korrekt sein werden. Das war schon ein Thema für uns, deshalb suchen wir nach einer Lösung. – NotDan