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 コレクションは常に更新されます。
確かに、テストで ComboBox を実際にレンダリングする必要はありません。レンダリングするための描画サーフェスをセットアップする必要さえありません。おそらく、私が必要とする唯一の答えは、「実際にボックスを描画する必要がない単体テストシナリオで、描画されたときと同じ方法で ComboBox を更新するにはどうすればよいですか?」ということです。