Отложенная оценка сообщения подтверждения NUnit
У меня это утверждение в моем тестовом коде
Assert.That(() => eventData.Count == 0,
Is.True.After(notificationPollingDelay),
"Received unexpected event with last event data" + eventData.Last().Description());
который утверждает какое-либо условие после определенного периода времени, а при сбое - сообщение. он не запускается, потому что строка сообщения построена, когда начинается утверждение, а не когда завершение завершается. поэтому коллекция eventData
по-прежнему пуста (как изначально), и попытка получить Description
последнего элемента в коллекции не удалась. есть ли обходной путь или достойная альтернатива этому в NUnit
или мне нужно вернуться к использованию Thread.Sleep
в моих тестах?
PS: Я использую NUnit 2.5.10.
Ответы
Ответ 1
Вы можете использовать эту схему:
var constrain = Is.True.After(notificationPollingDelay);
var condition = constrain.Matches(() => eventData.Count == 0);
Assert.IsTrue(condition,
"Received unexpected event with last event data" +
eventData.Last().Description());
Этот метод аналогичен использованию Thread.Sleep
Ответ 2
В версии NUnit 3.50 мне пришлось использовать другой синтаксис.
Вот пример:
var constraint = Is.True.After( delayInMilliseconds: 100000, pollingInterval: 100);
Assert.That( () => yourCondition, constraint );
Это проверит, является ли yourCondition
истинным, ожидая определенного максимального времени, используя DelayedConstraint
, созданный методом Is.True.After
.
В этом примере DelayedConstraint
настроен на максимальное время опроса 100 секунд каждые 0,1 секунды.
См. также устаревшую документацию NUnit 2.5 для DelayedConstraint.
Ответ 3
Самый простой ответ - "не включать этот текст в сообщение об ошибке". Я лично почти никогда не включаю сообщение об ошибке; если ваш тест достаточно атомный, вам не нужно это делать. Обычно, если мне нужно выяснить критический отказ, в любом случае помогает только отладчик.
Если вы действительно хотите это сделать, этот код должен работать без управления самими потоками.
try
{
Assert.That(() => eventData.Count == 0, Is.True.After(notificationPollingDelay));
}
catch(AssertionException)
{
throw new Exception("Received unexpected event with last event data" + eventData.Last().Description());
}