Как отладить приложение, которое зависит от времени? (используя текущую переменную DateTime вместо DateTime.Now) - PullRequest
1 голос
/ 03 ноября 2010

Я работаю над приложением (веб-приложение, asp.net и c #), которое зависит от даты и времени, поэтому, исходя из текущей даты, оно запустит формы, которые должен заполнить зарегистрированный пользователь.

Я думал о том, как мы собираемся смоделировать реальное использование приложения для целей отладки и тестирования.

Итак, я говорю о замене всех этих:

DateTime currentDate = DateTime.Now;

с чем-то вроде:

DateTime currentDate = MyDateClass.GetCurrentDate();

И тогда у меня будет класс:

public class MyDateClass
{
    private DateTime _currentDate;

    public DateTime GetCurrentDate()
    {
        // get the date, which may be different from DateTime.Now
        return _currentDate;
    }

    public void SetCurrentDate(DateTime newCurrentDate)
    {
        // set the date to the value chosen by the user
        _currentDate = newCurrentDate;
    }
}

позволяет мне устанавливать текущие данные, вызывая метод SetCurrentDate, например, в коде кнопки ссылки и в календаре.

Вопрос в том ... как мне точно хранить переменную DateTime во всем приложении? Я не могу работать с сессией в этом классе, верно? Должен ли я работать с темой?

Ну, идеи ценятся :) Заранее спасибо за ваши предложения!

<Ч />

Некоторые обновления по моему вопросу:

Я столкнулся с этим сообщением: Какой хороший способ перезаписать DateTime.Now во время тестирования?

Так же, как вы предоставили здесь свои ответы (спасибо!), Отличные советы для хорошей организации кода, как для целей разработки, так и для тестирования, которые я обязательно рассмотрю в будущем.

У меня все еще остается тот же вопрос: как я буду "держать" значение datetime?

Прямо сейчас я пошел с созданием одной таблицы ячеек в базе данных для поддержания «моего» значения даты и времени.

У меня есть статический класс с функцией GetCurrentDate и функцией SetCurrentDate:

public static class DateManagement
{
    public static DateTime GetCurrentDate()
    {
        // return DateTime.Now;
        // OR:
        // ... 
        // SqlCommand cmd = new SqlCommand("select Date from CurrentDate", conn);
        // ...
    }

    public static void SetCurrentDate(DateTime newDate) // used only in debugging
    {
        // ...
        // string insertStr = @"update CurrentDate set Date = '" + date + "'";
        // SqlCommand cmd = new SqlCommand(insertStr, conn);
        // ...
    }
}

Однако сохранение даты в базе данных с таблицей, созданной и используемой только для отладки, не выглядит элегантным решением ...

Ответы [ 2 ]

3 голосов
/ 03 ноября 2010

Создать интерфейс:

public interface ITimeProvider
{
    DateTime Now { get; }
}

Затем вы можете создать два подкласса - один для производственного использования, который просто возвращает текущее время, используя DateTime.Now, и другой, где вы можете вручную установить время для тестирования. Используйте внедрение зависимостей , чтобы обеспечить соответствующую реализацию.

1 голос
/ 03 ноября 2010

Можете ли вы использовать Rhino Mocks (или аналогичные), чтобы подделать текущую дату в ваших модульных тестах, вместо того, чтобы писать код только для целей тестирования?

...