Я подозреваю, что то, что вы видите во время отладки, является побочным эффектом. Утверждение не выполняется, поскольку оно ложно, но из-за проблем с потоками значение становится истинным к тому времени, когда вы просматриваете его в отладчике.
Увеличение времени ожидания в вашем тесте должно решить проблему, но будьте осторожны.
Поначалу таймеры кажутся хорошей идеей, но позже они могут привести к проблемам. Экологические проблемы, такие как выполнение других процессов или запуск тестов на более медленной машине, будут влиять на использование таймеров. К сожалению, если вы увеличите время ожидания в соответствии с потребностями самой медленной машины, вы получите серию очень медленных тестов.
Вместо того, чтобы использовать Thread.Sleep в своем тесте, подумайте над поиском способов сделать ваши тесты такими же быстрыми, как и код. Например, вызовите событие для вашего испытуемого, когда операция будет завершена.
[Test]
public void DemonstrateThatTheTestRunsAsFastAsTheSubjectUnderTest()
{
var resetEvent = new ManualResetEvent(true);
// configure our test to listen for the completed event
var subject = new MyTestSubject();
subject.OnComplete += (sender,e) => resetEvent.Set();
// perform the long running asynchronous operation
subject.DoLongRunningOperation();
// wait up to 10 seconds
resetEvent.WaitOne(100000);
Assert.AreTrue(subject.OperationComplete);
}
В приведенном выше примере мы используем ManualResetEvent , который будет блокировать выполнение до вызова операции Set . Также обратите внимание, что я передаю значение таймаута для события сброса, чтобы операция не выполнялась вечно. Если тайм-аут превышен, вполне вероятно, что наш OperationComplete все равно будет ложным, поэтому тест не пройден.
Если вы хотите, чтобы более мелкие детали определяли, истекло ли время ожидания теста, метод WaitOne возвращает логическое значение, указывающее, была ли операция успешной.
bool completedWithoutTimeout = resetEvent.WaitOne(10000);
Assert.IsTrue(completedWithoutTimeout, "The operation timed out.");