如何处理TDD的重构阶段

5
在TDD过程中,假设我编写了一个失败的测试用例,然后使其通过。我通过提取代码来重构原始单元,使用诸如“Extract Class”和“Move Method”等重构技术。现在进一步假设,我的原始测试用例不再覆盖提取出的代码,因为原始代码现在将其依赖项模拟出来,这是正确的单元测试方式。
那么,是否适合返回并给提取出的代码添加测试用例呢?或者说,在重构期间,我以某种方式使代码变成了未经测试的代码?随着我的代码库规模越来越大,必须进行重构,我不得不对经过重构后的代码进行大量的测试用例回归,这感觉非常尴尬。我是不是重构错误了?
2个回答

5
现在假设我的原始测试不再覆盖提取出来的代码,因为原始代码现在模拟了它的依赖项,这对于单元测试来说是正确的。模拟依赖关系通常是一件好事,但并非总是如此,并且我不会说对所有依赖项进行模拟是“单元测试的正确方法”。在TDD的重构步骤中,您应该更改生产代码中不影响测试通过的内容。同时,您不应该同时修改测试。您可能希望稍后修改测试,以使提取出的代码独立于原始代码进行测试,并在原始测试中进行模拟。

那么将测试进行改装是可以的吗? - Mike
当然可以。但是在你执行重构之前,他们应该继续工作并提供相同的覆盖率。重构不会导致你突然出现未覆盖的代码。 - Don Roby
我认为我的重构之一是伪装成新代码,因此它没有经过测试。 - Mike

0

这可能表明您的单元测试不够精细。例如,您编写了集成测试,使其通过,现在正在进行单元测试。

或者,重构后,您正在尝试对某些不应该进行测试的内容进行测试,例如私有方法。无论如何,重构都不应更改您的代码覆盖率。


这些都不是事实,但它们是对诊断的良好尝试。请查看@Don Roby的评论以了解发生了什么。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接