NUnit Assert.AreEqual DateTime Tolerances
Мне интересно, нашел ли кто-нибудь хорошее решение для этого:
В наших модульных тестах; мы обычно используем Assert.AreEqual()
для подтверждения наших результатов. Все хорошо и хорошо; пока мы не начнем использовать это в свойствах DateTime.
Хотя времена очень похожи, иногда они отключены на миллисекунды, что приводит к сбою тестов. В нашей заявке; пока они точны ко второму; это достаточно хорошо для нас.
Кто-нибудь нашел хороший способ как-то реализовать допуски в этом случае? Как правило, наше обходное решение состоит в том, чтобы разбить его на два отдельных заявления; который проверяет .ToShortDateString()
, а другой, который проверяет .ToShortTimeString()
, но это выглядит неаккуратным, на мой взгляд.
Ответы
Ответ 1
Вы можете проверить допуски с чем-то вроде:
Debug.Assert((date1 - date2) < TimeSpan.FromSeconds(1));
Если вы не знаете, какая дата более новая, используйте
Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1)
NUnit также добавил встроенную поддержку для этого, используя Within
ключевое слово
DateTime now = DateTime.Now;
DateTime later = now + TimeSpan.FromHours(1.0);
Assert.That(later, Is.EqualTo(now).Within(TimeSpan.FromHours(3.0)));
Assert.That(later, Is.EqualTo(now).Within(3).Hours);
Ответ 2
Используйте Assert.That и Is.Equal вместо Assert.AreEqual. Ниже приведен пример кода с самого сайта Nunit.
DateTime now = DateTime.Now;
DateTime later = now + TimeSpan.FromHours(1.0);
Assert.That(now, Is.EqualTo(now) );
Assert.That(later, Is.EqualTo(now).Within(TimeSpan.FromHours(3.0)));
Assert.That(later, Is.EqualTo(now).Within(3).Hours);
Ответ 3
Чтобы правильно проверить, равны ли любые 2 произвольные даты с точностью до 1 секунды, правильное решение:
Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1)
Я решил, что добавлю это как решение, так как принятое решение было неверным, если date2
больше, чем date1
более чем на секунду, и решение не было обновлено после моего комментария к @SwDevMan81.