在最近关于存根的问题中,许多答案建议使用 C# 接口或委托来实现存根,但一个答案建议使用条件编译,在生产代码中保留静态绑定。这个答案在阅读时被修改为 -2,所以至少有 2 人真的认为这是一个错误的答案。原因可能是误用 DEBUG,或者可能是使用固定值而不是更广泛的验证。但我不禁想知道:
使用条件编译是实现单元测试存根的一种不合适的技术吗?有时?总是?
谢谢。
编辑添加: 我想添加一个示例作为实验:
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; } }
}
这允许通过 C# 接口对“DateTime.Now”的传出依赖项进行存根。但是,我们现在添加了一个动态调度调用,其中静态就足够了,即使在生产版本中对象也更大,并且我们为 Foo 的构造函数添加了一个新的失败路径(分配可能会失败)。
我在这里什么都不担心吗?感谢您迄今为止的反馈!