С#, NUnit: Можно ли проверить, что DateTime очень близко, но не обязательно равно, другому?
Скажем, у меня есть этот тест:
[Test]
public void SomeTest()
{
var message = new Thing("foobar");
Assert.That(thing.Created, Is.EqualTo(DateTime.Now));
}
Это может привести, например, к отказу конструктора Thing потребовалось немного времени. Есть ли какая-то конструкция NUnit, которая позволила бы мне указать, что время Created
не должно быть точно равно DateTime.Now
, если оно, например, находится в пределах одной секунды от него?
И да, я знаю, что конструкторы не должны тратить много времени, но как пример: p
Ответы
Ответ 1
Я не пробовал, но согласно docs, похоже, что это должно работать:
Assert.That(thing.Created, Is.EqualTo(DateTime.Now).Within(1).Minutes);
Я не могу сказать, что я обычно являюсь поклонником системы ограничений - я поклонник Assert.AreEqual
, но эта конкретная конструкция довольно аккуратная.
(Как принципиально я должен отметить, что вам лучше было бы передать какой-то "часовый" интерфейс в качестве зависимости, а затем у вас не было бы никакой неточности. Вы могли бы подделать его для тестов, и использовать системные часы для производства.)
Ответ 2
Проверьте объект TimeSpan - сравните обе даты с помощью TimeSpan и проверьте, находятся ли значения в пределах вашего порога.
TimeSpan span = thing.Created - DateTime.Now;
if(span.TotalSeconds <= 1)
[..]
Ответ 3
Вам нужно начать с определения "очень близко". Если "очень близко" вы имеете в виду несколько сотен тиков, вы можете сделать это:
Assert.That(200, Is.LessThanOrEqualTo(DateTime.Now.Ticks - thing.Created.Ticks));
Затем, когда у вас есть даты в пределах 200 тиков, ваш тест проходит.
Ответ 4
Вы можете проверить вычесть их и проверить время.
DateTime.Now.Subtract(thing.Created).TotalSeconds
Дает вам итоговые секунды.
Ответ 5
Вы всегда можете вычесть переменные DateTime и получить TimeSpan. С интервалом времени вы можете делать все, что хотите.