gpt4 book ai didi

c# - 如何测试 WinForm 数据绑定(bind)?

转载 作者:行者123 更新时间:2023-11-30 22:29:43 25 4
gpt4 key购买 nike

我正在尝试在 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);
}

即使在绑定(bind)实例 b 上显式调用 b.WriteValue() 也是行不通的。

谢谢,马塞洛。

最佳答案

您似乎正在尝试测试 .Net 框架。您不应该为不属于您的代码编写测试。这里不错的选择是验收测试,它通过设置文本框文本作用于 UI(例如 White)。

顺便说一句,为什么 textBox 在您的用户控件中是公开的?应该隐藏实现。拥有像 string 类型的“Pattern”这样的属性是件好事。而且你不应该公开你的控件中使用的数据绑定(bind)。所以,如果您不想使用 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 是否已设置,因为当前测试可能失败有两个原因:文本框未绑定(bind)到 SomeProperty,或者 SomeProperty setter 工作不正确。

更新看here为什么在以编程方式设置文本后绑定(bind)不起作用。为了在属性更改时而不是在其验证时更新绑定(bind),请使用:

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 不适用于尚未创建的控件。所以这里的选项:

  • 创建假表单(使用 ControlTester)
  • 运行真实的形式
  • 实例化后调用 CreateControl()

我认为最后一个选项是最好的。要使 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));
}

关于c# - 如何测试 WinForm 数据绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10040758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com