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

NUnit Assert.AreEqual DateTime Tolerances

Мне интересно, нашел ли кто-нибудь хорошее решение для этого:

В наших модульных тестах; мы обычно используем Assert.AreEqual() для подтверждения наших результатов. Все хорошо и хорошо; пока мы не начнем использовать это в свойствах DateTime.

Хотя времена очень похожи, иногда они отключены на миллисекунды, что приводит к сбою тестов. В нашей заявке; пока они точны ко второму; это достаточно хорошо для нас.

Кто-нибудь нашел хороший способ как-то реализовать допуски в этом случае? Как правило, наше обходное решение состоит в том, чтобы разбить его на два отдельных заявления; который проверяет .ToShortDateString(), а другой, который проверяет .ToShortTimeString(), но это выглядит неаккуратным, на мой взгляд.

4b9b3361

Ответ 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.