Тестирование фонового работника с насмешками носорога
-
06-07-2019 - |
Вопрос
Допустим, у меня есть фоновый работник в классе, который выполняет запрос БД в фоновом потоке.
Я хочу проверить этот класс
так что я издеваюсь над своей БД и возвращаю какую-то коллекцию, пока все хорошо, убедитесь, что мой фоновый работник называется делать работу и чем я хочу убедиться, что финиш также произошел.
Я заметил, что тест проходит случайно и не проходит (я думаю, что это связано с потоками)
любые предложения
Решение
У вас может быть состояние гонки между фоновым потоком и подтверждениями / проверками.
Например:
[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 на долгое время непосредственно перед подтверждением), и если тест перестает завершаться неудачей, это является хорошим показателем состояния гонки.