NUnit Assert.AreEqual Допуски DateTime - PullRequest
       9

NUnit Assert.AreEqual Допуски DateTime

52 голосов
/ 26 августа 2010

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

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

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

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

Ответы [ 3 ]

82 голосов
/ 29 сентября 2011

Используйте 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);
79 голосов
/ 26 августа 2010

Вы можете проверить допуски следующим образом:

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);
10 голосов
/ 27 августа 2010

Чтобы правильно проверить, равны ли любые 2 произвольные даты с точностью до 1 секунды, следующее решение является правильным:

Debug.Assert(Math.Abs((date1 - date2).TotalSeconds) < 1)

Я решил добавить это как решение, поскольку принятое решение было неверным, когда date2 больше, чем date1 более чем на секунду, и решение не было обновлено после моего комментария к @ SwDevMan81.

...