Es scheint, als ob Sie versuchen, .Net-Framework zu testen. Sie sollten keine Tests für Code schreiben, den Sie nicht besitzen. Eine gute Option ist hier der Abnahmetest, der auf die Benutzeroberfläche wirkt (z. B. White), indem TextBox-Text festgelegt wird.
Btw, warum textBox
ist öffentlich in Ihrer Benutzerkontrolle? Die Implementierung sollte verborgen werden. Es ist gut, Eigenschaft wie 'Muster' des Typs string
zu haben. Und Sie sollten diese Datenbindung, die in Ihrer Kontrolle verwendet wird, nicht veröffentlichen. Also, wenn Sie wollen, wird nicht UI ausüben, dann guter Test für die Kontrolle sein:
[Test]
public void ShouldUpdateEntityWhenPatternChanged()
{
//Arrange
var entity = new MyEntity() { SomeProperty = "someValue" };
var userControl = new MyUserControl() { Entity = entity };
const string pattern = @"xxx";
//Act
userControl.Pattern = pattern;
//Assert
Assert.That(entity.SomeProperty, Is.EqualTo(pattern));
}
Ideale zum Schein Einheit sein würde, und überprüfen nur, dass SomeProperty wurde eingestellt, weil zur Zeit Test in zwei Gründen fehlschlagen könnte : Textfeld ist nicht an SomeProperty gebunden, oder SomeProperty Setter funktioniert falsch.
UPDATE Look here warum Bindung funktioniert nicht nach dem programmgesteuerten Festlegen von Text. Um eine Bindung zu aktualisieren, wenn Eigenschaft statt, wenn seine Validieren, Nutzungsänderungen:
textBox.DataBindings.Add("Text", entity, "SomeProperty", true, DataSourceUpdateMode.OnPropertyChanged);
UPDATE wie Kontrolle Scheint sollte für die Validierung sichtbar sein. Wenn Sie nicht DataSourceUpdateMode ändern möchten, und Sie laufen nicht Ihre Tests auf Service ohne UI, dann einfach ControlTester wird Ihnen helfen:
public class ControlTester : IDisposable
{
private Form _form = new Form();
public ControlTester(Control control)
{
_form = new Form();
_form.Controls.Add(control);
_form.Show();
}
public void Dispose()
{
_form.Close();
}
}
es verwenden, wenn auf Kontrolle im Test handeln:
using(new ControlTester(userControl))
userControl.Pattern = pattern;
LETZTE UPDATE: DataBining funktioniert nicht für die Kontrolle, die nicht erstellt wurde. Also hier Optionen:
- erstellen gefälschte Form (mit ControlTester)
- Run echte Form
- Aufruf Create() nach der Instanziierung es
Ich denke letzte Option ist die beste. Damit DataBinding im Test funktioniert, können Sie einfach die CreateControl() -Methode aufrufen:
Überraschen! Durch Hinzufügen des folgenden Codes im Arrangierabschnitt wird der Test bestanden. Formular f = new Form(); f.Controls.Add (entiIntervenutiUserControl); f.Show(); ... Es scheint, dass Datenbindung nur auf Steuerelemente wirkt, die einem sichtbaren Formular zugeordnet sind. – Marcello
Sorry, ich habe vergessen zu sagen, dass auch b.WriteValue() aufgerufen werden muss, wobei b die von DataBindings.Add (...) zurückgegebene Binding-Instanz ist. Andernfalls, wie unten von lazyberezovsky vorgeschlagen, können Sie binden mit DataBindings.Add ("Text", Entität, "Altri", True, DataSourceUpdateMode.OnPropertyChanged); – Marcello
Also, welcher Teil Ihrer Frage wird von meiner Antwort nicht beantwortet? –