В недавнем вопросе о заглушке во многих ответах предлагались интерфейсы или делегаты C # для реализации заглушек, но один ответ предлагал использовать условную компиляцию, сохраняя статическую привязку в рабочем коде. Этот ответ был изменен на -2 во время чтения, поэтому, по крайней мере, 2 человека действительно думали, что это был неправильный ответ. Возможно, причиной было неправильное использование DEBUG, или, возможно, использование фиксированного значения вместо более обширной проверки. Но я не могу не задаться вопросом:
Является ли использование условной компиляции неподходящим методом для реализации заглушек модульных тестов? Иногда? Всегда
Спасибо.
Edit-add: Я хотел бы добавить пример в качестве эксперимента:
class Foo {
public Foo() { .. }
private DateTime Now {
get {
#if UNITTEST_Foo
return Stub_DateTime.Now;
#else
return DateTime.Now;
#endif
}
}
// .. rest of Foo members
}
по сравнению с
interface IDateTimeStrategy {
DateTime Now { get; }
}
class ProductionDateTimeStrategy : IDateTimeStrategy {
public DateTime Now { get { return DateTime.Now; } }
}
class Foo {
public Foo() : Foo(new ProductionDateTimeStrategy()) {}
public Foo(IDateTimeStrategy s) { datetimeStrategy = s; .. }
private IDateTime_Strategy datetimeStrategy;
private DateTime Now { get { return datetimeStrategy.Now; } }
}
Что позволяет использовать исходящую зависимость от DateTime.Now через интерфейс C #. Однако теперь мы добавили динамический диспетчерский вызов, в котором было бы достаточно static, объект был бы больше даже в рабочей версии, и мы добавили новый путь отказа для конструктора Foo (распределение может завершиться с ошибкой).
Я здесь ни о чем не беспокоюсь? Спасибо за отзыв!