TDD - 在重构时引入一个类 - 该类应该进行单元测试吗?

时间:2009-05-19 21:12:45

标签: unit-testing tdd dependency-injection

假设您有一个通过所有当前单元测试的类。

如果您要添加或提取一些方法/引入一个新类,然后使用组合来包含相同的功能,那么新类需要测试吗?

我是否应该这样做,所以任何建议都会很棒。

修改

假设我应该添加我使用DI(依赖注入)因此我是否应该注入新类?

5 个答案:

答案 0 :(得分:5)

不是在TDD的背景下,不,恕我直言。现有的测试证明了关于类的存在的一切。如果您需要向类添加行为,那么就是引入测试的时候了。

话虽这么说,它可能会使您的代码和测试更清晰,将测试移动到与您所创建的新类相关的类中。这在很大程度上取决于具体案例。

编辑:编辑之后,我会说这是移动现有测试(或现有测试的一部分)的好例子。如果这个类是如此分离以至于它需要注入,那么听起来现有的测试可能不会明显地覆盖它,如果它们保持原样。

答案 1 :(得分:5)

最初,不,他们没有必要。如果你有完美的覆盖率,提取课程并且什么也没做,你仍然会有完美的覆盖率(那些测试会证实提取确实是纯粹的重构)。

但最终 - 可能很快 - 是的。提取的类可能在其原始上下文之外使用,并且您希望使用特定于新类的测试来约束其行为,以便新上下文的更改不会无意中影响原始调用方的行为。当然,原始测试仍然可以揭示这一点,但良好的单元测试直接指向有问题的单元,原来的测试现在已经过了一步。

将新测试作为新提取的类的可执行文档也很好。

答案 2 :(得分:1)

嗯,是的,没有。

如果我理解正确,你已经编写了测试,并编写了使测试通过的生产代码 - 即最简单的方法。

现在您处于重构阶段。您希望从一个类中提取代码并将其放在自己的类中,这可能是为了跟上单一责任原则(或SRP)。

您可以在不使用添加测试的情况下进行重构,因为您的测试正是为了让您无需担心重构。记住 - 重构意味着在不修改功能的情况下更改代码。

但是,重构代码很可能会破坏您的测试。这很可能是由测试行为的脆弱测试引起的,而不是状态 - 即你嘲笑你移植的方法。

另一方面,如果您的测试主要是状态驱动的(即您断言结果,并忽略实现),那么您的新服务组件(您提取到新类的代码块)将不会被测试。如果您使用某种形式的代码覆盖率测试工具,您会发现。如果是这种情况,您可能希望测试它是否有效。 可能,因为100%代码覆盖率既不可取也不可行。如果可能的话,我会尝试为该服务添加测试。

最后,它很可能归结为一个判断电话。

答案 3 :(得分:0)

我会说不。它已经在老班上进行测试。

答案 4 :(得分:0)

正如其他人所说,它可能并不是完全需要的,因为所有相同的东西仍在测试中。但是一旦你开始分别对这两个类中的任何一个进行更改,你应该将测试分开。

当然,测试不应该太难写;既然你已经测试了这些东西,那么打破测试的各个部分应该是相当简单的。