Вопрос

Допустим, у меня есть фоновый работник в классе, который выполняет запрос БД в фоновом потоке.

Я хочу проверить этот класс

так что я издеваюсь над своей БД и возвращаю какую-то коллекцию, пока все хорошо, убедитесь, что мой фоновый работник называется делать работу и чем я хочу убедиться, что финиш также произошел.

Я заметил, что тест проходит случайно и не проходит (я думаю, что это связано с потоками)

любые предложения

Это было полезно?

Решение

У вас может быть состояние гонки между фоновым потоком и подтверждениями / проверками.

Например:

[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);
}

Один из способов проверить, является ли это состояние гонки, состоит в том, чтобы отложить тестовый поток (вызвать Thread.Sleep на долгое время непосредственно перед подтверждением), и если тест перестает завершаться неудачей, это является хорошим показателем состояния гонки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top