如何测试 WinForm DataBinding

本文关键字:WinForm DataBinding 测试 何测试 | 更新日期: 2023-09-27 18:30:19

我正在尝试在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 上,也不起作用。

谢谢马塞洛。

如何测试 WinForm DataBinding

看起来你正在尝试测试.Net框架。你不应该为你不拥有的代码编写测试。这里的好选择是验收测试,它通过设置文本框文本作用于 UI(例如白色)。

顺便说一句,为什么textBox在您的用户控件中是公开的?实施应该是隐藏的。拥有像 string 类型的"模式"这样的属性是件好事。并且不应公开控件中使用的数据绑定。因此,如果您不想练习 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 工作不正确。

更新查看此处为什么以编程方式设置 Text 后绑定不起作用。若要在属性更改时更新绑定,而不是在验证时更新绑定,请使用:

textBox.DataBindings.Add("Text", entity, "SomeProperty", true, DataSourceUpdateMode.OnPropertyChanged);

更新似乎控件应该可见以进行验证。如果您不想更改 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 不适用于尚未创建的控件。所以这里有选项:

  • 创建假表单(使用控制测试器)
  • 运行真实形式
  • 实例化后调用 CreateControl()

我认为最后一个选项是最好的选择。要使数据绑定在测试中工作,您可以简单地调用 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));
}