当使用遗留代码并尝试创建测试时,我经常从类或方法中分解出依赖关系,以便可以使用模拟为这些依赖关系编写单元测试。依赖性通常以对静态类和使用构造函数或该类其他位置中的new关键字创建的对象的调用的形式出现。

在大多数情况下,可以通过包装静态依赖项来处理静态调用,也可以通过以staticClass.Current.MethodCall()的形式通过其接口(interface)传递依赖项的单例模式(或类似方式)来处理构造函数。

在大多数情况下,只需在构造函数中传递该接口(interface)即可代替在构造函数中使用new关键字。

在大多数情况下,可以通过与上述相同的方法来处理new关键字在类的其他部分中的使用,或者通过创建工厂(如果需要)并在构造函数中传递工厂的接口(interface)来处理。

我始终使用Resharpers重构工具来帮助我实现所有这些突破,但是大多数事情仍然是体力劳动(可以自动化),对于某些旧式类和方法而言,这可能是非常繁琐的过程。还有其他重构插件和/或工具在此过程中对我有帮助吗?是否存在“只需单击即可分解此类中的所有依赖关系”的重构工具? =)

在我看来,所有这些步骤对于许多开发人员来说都是常见的,并且是一个常见的问题,在我尝试将插件编写为Resharper或CodeRush之前,我不得不问一下,因为有人可能已经尝试过了。

已添加:

反射(reflect)出以下答案:即使您可能不想一次分解所有内容(一键单击总分解可能会导致更多问题,但超出其帮助范围),仍然能够简单地分解1个方法依赖项或1-2个依赖关系,会有很大的不同。

此外,重构代码的度量标准是“尝试并了解所发生的事情,以了解所有内容如何融合在一起”,并且一键单击即可全面突破,即使您不检入该代码也是如此。

最佳答案

我认为没有任何工具可以为您实现自动化。如您所知,使用遗留代码意味着一次仅需很少的步骤即可更改代码。这些步骤通常故意较小,以防止发生错误。通常,您应该进行的第一个更改是使该代码可测试的更改。编写测试后,您可以以修正漏洞或实现RFC的方式更改代码的这一部分。

因为您应该采取一些小步骤,所以我相信很难使用重构工具神奇地使所有依赖项消失。使用遗留系统,您几乎永远不会想要立即进行大的更改,因为发生故障的风险(并且由于缺乏测试而无法发现)的风险太大。但是,这并不意味着重构工具在这种情况下没有用。相反;他们有很大帮助。

如果您还没有的话,我建议您阅读Michael Feathers的书Working Effectively with Legacy Code。它详细描述了一系列模式,可帮助您将遗留代码重构为可测试性更高的系统。

祝你好运。

10-07 13:09
查看更多