2010-06-02 4 views
0

Я начинаю строить часть системы, которая проведет много валидаций DateTime, и много «если бы это было сделано раньше» или «если она начнется через час и т. Д.».Как мне создать свою собственную 'now'/DateTime.Now?

Обычный путь состоит в использовании DateTime.Now, чтобы получить фактическое время.

Я предсказываю, однако, что во время модульного теста, который даст мне настоящую головную боль, потому что мне нужно будет настроить мои тестовые данные за время, когда тест будет работать вместо использования набора данных теста по умолчанию. Итак, я подумал: почему бы не использовать мое собственное «сейчас», поэтому я могу установить текущее время и время в любой момент времени. Поскольку я не хочу устанавливать внутренние часы testervers, я думал об этом решении, и мне было интересно, что вы думаете об этом. Основой является то, что я использую свой собственный класс DateTime. Этот класс дает вам текущее время и время, но вы также можете настроить свое собственное время снаружи.

public static class MyDateTime 
    { 
     private static TimeSpan _TimeDifference = TimeSpan.Zero; 
     public static DateTime Now 
     { 
      get 
      { 
       return DateTime.Now + _TimeDifference; 
      } 
     } 
     public static void SetNewNow(DateTime newNow) 
     { 
      _TimeDifference = newNow - DateTime.Now; 
     } 
     public static void AddToRealTime(TimeSpan timeSpan) 
     { 
      _TimeDifference = timeSpan; 
     } 
     public static void SubtractFromRealTime(TimeSpan timeSpan) 
     { 
      _TimeDifference = - timeSpan; 
     } 
    } 
+0

что случилось с встроенными методами Framework DateTime? –

+0

Возможный дубликат: http://stackoverflow.com/questions/2425721/unit-testing-datetime-now –

+0

Я бы не назвал его 'MyDateTime', слишком легко ошибочным для' DateTime', лучше назвать его чем-то более простым выделить. –

ответ

3

Некоторое время назад я уже кое-что прочитал об этом. Короткий поиск mock DateTime.Now с вашей любимой поисковой системой должен показывать достаточно ссылок.

Это, кажется, выглядит довольно интересно: http://blog.typemock.com/2009/05/mockingfaking-datetimenow-in-unit-tests.html

+0

разве это не платный продукт? Кроме того, я немного устойчив к реализации/использованию совершенно новой структуры, о которой я ничего не знаю для этой небольшой функциональности. – Michel

0

что у вида? , если вам нужна какая-либо специализация, поэтому вы можете использовать методы расширения! легко написать метод расширения для класса DateTime и делать то, что вам нужно.

+0

Это правда, но и метод расширения должен иметь некоторый код? – Michel

Смежные вопросы