Frage

kann sagen, dass ich einen Hintergrund Arbeiter in einer Klasse, die DB-Abfrage in einem Hintergrund-Thread ausführen.

ich will Test dieser Klasse

so verspotten ich meine db und eine Sammlung zurückkehren, so weit so gut, stellen Sie sicher, mein Hintergrund Arbeiter die Arbeit do genannt und als ich möchte sicherstellen, dass das Ziel auch geschehen ist.

Ich habe bemerkt, dass der Testdurchlauf und nicht zufällig (ich glaube, es hat etwas mit Themen zu tun hat)

Anregungen

War es hilfreich?

Lösung

Sie können eine Racebedingung zwischen dem Hintergrund-Thread haben und behauptet / prüft.

Zum Beispiel:

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

Der Faden endet nicht unbedingt vor der behauptet, manchmal wird es und manchmal wird es nicht. Eine Lösung für diesen Fall ist der Hintergrund-Thread zu verbinden:

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

Eine Möglichkeit, zu überprüfen, ob es eine Race-Bedingung ist, um den Test-Thread (Aufruf Thread.Sleep für lange Zeit kurz vor dem assert) zu verzögern und wenn der Test beendet, das ist guter Indikator für Race-Bedingung scheitern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top