如何处理 TDD 的重构阶段
Posted
技术标签:
【中文标题】如何处理 TDD 的重构阶段【英文标题】:How to handle the refactoring phase of TDD 【发布时间】:2011-04-14 00:59:57 【问题描述】:在 TDD 会话过程中,假设我编写了一个失败的测试,然后让它通过。我通过提取原始单元中的代码进行重构,使用提取类和移动方法等重构。现在进一步假设我的原始测试不再涵盖提取的代码,因为原始代码现在模拟了它的依赖关系,这对于单元测试是正确的。
返回并对提取的代码进行改进测试是否合适?还是我在重构过程中最终得到未经测试的代码时犯了一个错误?感觉就像我的代码库正在扩展,我必须重构,我正在对重构的代码进行大量测试。这感觉真的很尴尬。我重构错了吗?
【问题讨论】:
【参考方案1】:现在进一步假设我的原始测试不再涵盖提取的代码,因为原始代码现在模拟了它的依赖关系,这对于单元测试是正确的。
模拟依赖项通常是一件好事,但并非总是如此,而且我不会说模拟所有依赖项是“正确的单元测试”。
在 TDD 的重构步骤中,您应该更改生产代码中不影响测试通过的内容。而且您不应该同时更改测试。
您可能希望稍后修改您的测试,以便独立于原始代码对提取的代码进行测试,并在原始测试中模拟。
【讨论】:
所以可以改造测试吗? 当然。但他们应该继续工作并提供相同的覆盖范围,直到您这样做。重构不会导致您突然发现代码。 我认为我的重构之一是变相的新代码,因此它未经测试。【参考方案2】:这可能表明您的单元测试不够细粒度。就像,您已经编写了集成测试并通过了测试,现在您正在实施单元测试。
或者也许在重构之后你试图对你不应该测试的东西进行测试,比如私有方法。无论如何,重构不应该改变你的代码覆盖率。
【讨论】:
并非如此,但它们是很好的诊断尝试。检查@Don Roby 的 cmets 了解发生了什么。以上是关于如何处理 TDD 的重构阶段的主要内容,如果未能解决你的问题,请参考以下文章