Подтвердить что ты не робот

Отложенная оценка сообщения подтверждения 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.

4b9b3361

Ответ 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());
}