【发布时间】:2011-05-01 08:00:54
【问题描述】:
除非代码设置为要测试,否则您无法测试代码是否被普遍接受?
一段假设的代码:
public void QueueOrder(SalesOrder order)
{
if (order.Date < DateTime.Now-20)
throw new Exception("Order is too old to be processed");
...
}
有些人会考虑将其重构为:
protected DateTime MinOrderAge;
{
return DateTime.Now-20;
}
public void QueueOrder(SalesOrder order)
{
if (order.Date < MinOrderAge)
throw new Exception("Order is too old to be processed");
...
}
注意:你可以想出更复杂的解决方案;涉及IClock 接口和工厂。这不影响我的问题。
更改上述代码的问题是代码已更改。代码已更改,而客户并未要求更改。任何改变都需要召开会议和电话会议。所以我处于不测试任何东西更容易的地步。
如果我不愿意/不能做出改变:这会让我无法进行测试吗?
注意: 上面的伪代码可能看起来像 C#,但这只是为了它的可读性。这个问题与语言无关。
注意:假设代码sn-p、问题、需要重构、重构是假设的。如果您对我的不满意,您可以插入自己的假设代码示例。
注意:以上假设代码是假设的。与任何代码的任何关系,无论是活的还是死的,纯属巧合。
注意:代码是假设的,但任何答案都不是。这个问题不是主观的:因为我相信有一个答案。
更新: 当然,这里的问题是我不能保证上述示例中的更改不会破坏任何内容。当然,我将一段代码重构为一个单独的方法,并且代码在逻辑上是相同的。
但我不能保证添加新的受保护方法不会偏移对象的虚拟方法表,如果这个类在 DLL 中,那么我刚刚引入了访问冲突。
【问题讨论】:
-
您可以对任何代码进行单元测试。有些类比其他类更难测试。例如,servlet 类比 POJO 更难进行单元测试,因为 servlet 类比 POJO 依赖更多的基础设施
标签: unit-testing language-agnostic regression