2

このテストは、NUnit コンソール ランナーで実行すると失敗します。TestDriven.NET でそのテストだけを実行すると機能しますが、TestDriven.NET でスイート全体を実行すると機能しません。

[Test]
public void BackgroundWorkerFiresRunWorkerCompleted()
{
  var runner = new BackgroundWorker();
  ManualResetEvent done = new ManualResetEvent(false);
  runner.RunWorkerCompleted += delegate { done.Set(); };

  runner.RunWorkerAsync();

  bool res = done.WaitOne(TimeSpan.FromSeconds(10));
  // This assert fails:
  Assert.IsTrue(res, "RunWorkerCompleted was not executed within 10 seconds");
}

問題はメッセージループがないことに関係していると思われますが、よくわかりません。

BackgroundWorker を使用するための要件は何ですか?

テストを機能させるための回避策はありますか?

4

3 に答える 3

7

とにかく、テストは通常​​ブロッキング方式で実行されるため、メッセージ ポンプとは関係ないと思います。しかし、処理されない Windows メッセージを使用する「UI」スレッドでイベントが呼び出される可能性があります。

したがって、問題がメッセージ ポンプまたは Windows メッセージが処理されていない場合は、次のようにして現在のbool res = done.WaitOne(TimeSpan.FromSeconds(10));行を置き換えることができます。

DateTime end = DateTime.Now.AddSeconds(10);
bool res = false;
while ((!res) && (DateTime.Now<end)) {
   Application.DoEvents();
   res = done.WaitOne(0):
}
于 2009-04-15T12:45:48.253 に答える
0

BGW DoWork イベント ハンドラがありませんか?

于 2009-04-15T12:31:13.247 に答える
-2

次の前に Sleep を追加するだけです。

Assert.IsTrue(res, "RunWorkerCompleted was not executed within 10 seconds");

このようなもの:

System.Threading.Thread.Sleep(10000);

于 2011-01-10T17:53:42.527 に答える