Я использую VS2008 для .NET 2.0 Framework, и, на всякий случай, нет, я не могу изменить это:)
У меня есть DateCalculator
класс. Его метод GetNextExpirationDate
пытается определить следующий срок действия, внутренне используя DateTime.Today
в качестве базовой даты.
Когда я писал модульные тесты, я понял, что хочу проверить GetNextExpirationDate
на разные «сегодняшние» даты.
Какой лучший способ сделать это? Вот несколько альтернатив, которые я рассмотрел:
- Предоставить свойство / перегруженный метод с аргументом
baselineDate
и использовать его только из модульного теста. В реальном клиентском коде игнорируйте свойство / перегруженный метод в пользу метода, который по умолчанию baselineDate
равен DateTime.Today
. Я не хочу этого делать, так как это делает публичный интерфейс класса DateCalculator неловким.
- Создайте защищенное поле с именем
baselineDate
, для которого внутренне установлено значение DateTime.Today
. При тестировании выведите DateCalculatorForTesting
из DateCalculator
и установите baslineDate
через конструктор. Он поддерживает общедоступный интерфейс в чистоте, но все же не так хорош - baselineDate
был сделан защищенным и требуется производный класс, оба предназначены исключительно для тестирования.
- Использовать методы расширения. Я попробовал это после добавления
ExtensionAttribute
, затем понял, что это не будет работать, потому что методы расширения не могут получить доступ к закрытым / защищенным переменным. Сначала я думал, что это действительно довольно элегантное решение. (
Мне было бы интересно услышать, что думают другие.