Тестирование фонового работника с насмешками носорога - PullRequest
1 голос
/ 25 октября 2009

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

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

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

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

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

1 Ответ

1 голос
/ 25 октября 2009

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

Например:

[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 на долгое время непосредственно перед подтверждением), и если тест перестанет проваливаться, это хороший признак состояния гонки.

...