Чтобы выполнить некоторые из ответов здесь, мне пришлось получить ParametrizedType MyGenericClass, независимо от того, насколько высока иерархия, с помощью рекурсии:
private Class<T> getGenericTypeClass() {
return (Class<T>) (getParametrizedType(getClass())).getActualTypeArguments()[0];
}
private static ParameterizedType getParametrizedType(Class clazz){
if(clazz.getSuperclass().equals(MyGenericClass.class)){ // check that we are at the top of the hierarchy
return (ParameterizedType) clazz.getGenericSuperclass();
} else {
return getParametrizedType(clazz.getSuperclass());
}
}
Я не пробовал это, но согласно документам , похоже, это должно работать:
Assert.That(thing.Created, Is.EqualTo(DateTime.Now).Within(1).Minutes);
Я не могу сказать, что обычно я большой поклонник системы ограничений - я фанат Assert.AreEqual
- но эта конкретная конструкция довольно аккуратна.
(В качестве принципиального момента я должен отметить, что вам лучше было бы передать какой-нибудь интерфейс «часов» в качестве зависимости, и тогда у вас не будет никакой неточности. Вы можете подделать его для тестов, и использовать системные часы для производства.)
Проверьте объект TimeSpan - сравните обе даты, используя TimeSpan, и проверьте, находятся ли значения в пределах вашего порога.
TimeSpan span = thing.Created - DateTime.Now;
if(span.TotalSeconds <= 1)
[..]
Вы бы нужно начать с определения «очень близко». Если под «очень близко» вы подразумеваете несколько сотен тактов, то вы можете сделать это:
Assert.That(200, Is.LessThanOrEqualTo(DateTime.Now.Ticks - thing.Created.Ticks));
Затем, когда у вас есть даты в пределах 200 тактов, ваш тест проходит.
Вы всегда можете вычесть переменные DateTime и получить TimeSpan. С Time span вы можете делать все, что хотите.
Вы можете проверить, вычесть их и проверить временной интервал.
DateTime.Now.Subtract(thing.Created).TotalSeconds
Дает вам общее количество секунд.