我正在尝试在WinForm应用程序中测试DataBinding。 以下测试用例失败。
[Test]
public void TestOneWayEntityBinding()
{
//Arrange
var entity = new MyEntity();
entity.SomeProperty = "someValue";
var userControl = new MyUserControl();
const string pattern = @"xxx";
//Act
userControl.textBox.DataBindings.Add("Text", entity, "SomeProperty");
userControl.textBox.Text = pattern;
//Assert
Assert.AreEqual(pattern, entity.SomeProperty);
}
即使明确地将b.WriteValue()调用到绑定实例b上也不起作用。
谢谢, 马塞罗。
答案 0 :(得分:3)
您似乎正在尝试测试.Net框架。你不应该为你不拥有的代码编写测试。这里的好选择是验收测试,它通过设置textBox文本来作用于UI(例如White)。
顺便说一句,为什么textBox
在您的用户控件中是公开的?应隐藏实施。拥有像string
类型的'Pattern'这样的属性是很好的。并且您不应该暴露控件中使用的数据绑定。因此,如果您不想练习UI,那么对您的控制进行良好测试将是:
[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));
}
理想情况下是模拟实体并且只是验证SomeProperty已设置,因为当前测试可能会因两个原因而失败:文本框未绑定到SomeProperty,或者SomeProperty setter工作不正确。
UPDATE 查看here为什么在以编程方式设置Text后绑定无效。要在属性更改而不是验证时更新绑定,请使用:
textBox.DataBindings.Add("Text", entity, "SomeProperty", true, DataSourceUpdateMode.OnPropertyChanged);
UPDATE 似乎控件应该可见以进行验证。如果您不想更改DataSourceUpdateMode,并且在没有UI的情况下不在服务上运行测试,那么简单的ControlTester将帮助您:
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();
}
}
在对待测试控制时使用它:
using(new ControlTester(userControl))
userControl.Pattern = pattern;
最后更新: DataBining不适用于尚未创建的控件。所以这里的选项:
我认为最后一个选项是最好的。要使DataBinding在测试中工作,您只需调用CreateControl()方法:
[Test]
public void ShouldUpdateEntityWhenPatternChanged()
{
//Arrange
const string pattern = @"xxx";
var entity = new MyEntity() { SomeProperty = "someValue" };
var userControl = new MyUserControl();
userControl.CreateControl();
userControl.Entity = entity;
//Act
userControl.Pattern = pattern;
//Assert
Assert.That(entity.SomeProperty, Is.EqualTo(pattern));
}