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

С#, 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

4b9b3361

Ответ 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. С интервалом времени вы можете делать все, что хотите.