我创建了一个从 ComboBox 派生的控件,并希望对其行为进行单元测试。
但是,它在我的单元测试中的行为似乎与它在实际应用程序中的行为不同。
在实际应用程序中,Combobox.DataSource 属性和 .Items 同步 - 换句话说,当我更改 Combobox.DataSource 时,.Items 列表会立即自动更新以显示 DataSource 的每个元素的项目。
在我的测试中,我构造了一个 ComboBox,为其分配了一个数据源,但 .Items 列表根本没有更新,仍然是 0 个项目。因此,当我尝试在测试中将 .SelectedIndex 更新为 0 以选择第一项时,我收到 ArgumentOutOfRangeException。
这是因为我的单元测试中没有 Application.Run 开始一个事件循环,还是这有点像红鲱鱼?
编辑:第一次测试的更多细节:
[SetUp]
public void SetUp()
{
mECB = new EnhancedComboBox();
mECB.FormattingEnabled = true;
mECB.Location = new System.Drawing.Point( 45, 4 );
mECB.Name = "cboFind";
mECB.Size = new System.Drawing.Size( 121, 21 );
mECB.TabIndex = 3;
mECB.AddObserver( this );
mTestItems = new List<TestItem>();
mTestItems.Add( new TestItem() { Value = "Billy" } );
mTestItems.Add( new TestItem() { Value = "Bob" } );
mTestItems.Add( new TestItem() { Value = "Blues" } );
mECB.DataSource = mTestItems;
mECB.Reset();
mObservedValue = null;
}
[Test]
public void Test01_UpdateObserver()
{
mECB.SelectedIndex = 0;
Assert.AreEqual( "Billy", mObservedValue.Value );
}
在尝试将 SelectedIndex 设置为 0 时,测试在第一行失败。在调试时,这似乎是因为当 .DataSource 更改时,.Items 集合没有更新以反映这一点。但是,在调试实际应用程序时,始终会在 .DataSource 更改时更新 .Items 集合。
当然,我不必在测试中实际渲染 ComboBox,我什至没有设置任何绘图表面来渲染!也许我需要的唯一答案是“在我实际上不需要绘制框的单元测试场景中,如何以与绘制时相同的方式更新组合框?”