Можно ли переопределить Date.Now или Date.Today для целей отладки в веб-приложении ASP.NET? - PullRequest
4 голосов
/ 05 августа 2011

У нас очень большая система, в которой отчеты выполняются с дат от определенных дней до сегодняшней даты, используя различные определения «GenerateSalesReport (DateStart, Date.Now)».имитировать отчеты, которые происходили в прошлом, поэтому мне нужно изменить объект «Date.Now» на конкретную дату из прошлого в моей среде разработки.Можно ли переопределить date.Now?

Ответы [ 3 ]

6 голосов
/ 05 августа 2011

Это один из недостатков DateTime.Now и связанных с ним функций.

Вы должны передавать DateTime любой функции, которая на него опирается. Любое место, которое вы используете DateTime.Now или DateTime.Today (и т. Д.), - это место, где вы должны проходить дату.

Это позволяет вам тестировать различные значения DateTime, сделает ваш код более тестируемым и уберет временную зависимость.

4 голосов
/ 05 августа 2011

Хорошее решение - абстрагировать внешние зависимости, чтобы иметь возможность заглушить их во время теста. Для виртуализации времени я часто использую что-то вроде этого:

public interface ITimeService {

  DateTime Now { get; }

  void Sleep(TimeSpan timeSpan);

}

В вашем случае вам не нужна часть Sleep, поскольку вы зависите только от текущего времени, и, конечно, вам нужно изменить свой код, чтобы использовать ITimeService, предоставляемый извне, когда требуется текущее время.

Обычно вы используете эту реализацию:

public class TimeService : ITimeService {

  public DateTime Now { get { return DateTime.Now; }

  public void Sleep(TimeSpan timeSpan) { Thread.Sleep(timeSpan); }

}

Для целей тестирования вы можете использовать эту заглушку:

public class TimeServiceStub : ITimeService {

  public TimeServiceStub(DateTime startTime) { Now = startTime; }

  public DateTime Now { get; private set; }

  public void Sleep(TimeSpan timeSpan) { Now += timeSpan; }

}
0 голосов
/ 05 августа 2011

Даже если бы это было возможно, вам, вероятно, было бы лучше изменить системное время.В противном случае вы создали совершенно новый контрольный пример (когда ваша система работает в другое время, чем любой другой процесс в системе).Кто знает, с какими проблемами вы можете столкнуться.

...