質問

バックグラウンドスレッドでdbクエリを実行するクラスにバックグラウンドワーカーがいると言います。

このクラスをテストしたい

だから、私のデータベースをモックし、これまでのところ良いコレクションを返します。 バックグラウンドワーカーがdo workと呼ばれることを確認してください そして、私も仕上げが起こったことを確認したいより。

テストがランダムに成功および失敗することに気づきました(スレッドと関係があると思います)

提案

役に立ちましたか?

解決

バックグラウンドスレッドとアサート/検証の間に競合状態がある可能性があります。

例:

[Test]
public void TestWithRaceCondition()
{
    bool called = false;
    new Thread(() => called = true).Start();
    Assert.IsTrue(called);
}

スレッドは、アサートの前に必ずしも終了するわけではありません。終了する場合と終了しない場合があります。この場合の解決策は、バックグラウンドスレッドに参加することです:

[Test]
public void TestWithoutRaceCondition()
{
    bool called = false;
    var thread = new Thread(() => called = true);
    thread.Start();
    thread.Join()
    Assert.IsTrue(called);
}

競合状態であるかどうかを確認する1つの方法は、テストスレッドを遅延させ(アサートの直前にThread.Sleepを呼び出す)、テストが失敗を停止した場合、競合状態の良い兆候です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top