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