繁体   English   中英

打破类中所有依赖项的最简单,最快捷的方法

[英]Simplest, fastest way to break out all dependencies from a class

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

在大多数情况下,静态调用通过包装静态依赖项来处理,或者如果它以StaticClass.Current.MethodCall()形式的单例模式(或类似)通过其接口传递该依赖项而改为构造函数。

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

在大多数情况下,在类的其他部分中使用new关键字可以通过与上面相同的方法处理,也可以根据需要创建工厂,并在构造函数中传递工厂的接口。

我总是使用Resharpers重构工具来帮助我解决所有这些问题,但是大多数事情仍然是手工劳动(可能是自动化的),对于一些遗留的类和方法来说,这可能是一个非常繁琐的过程。 是否有任何其他重构插件和/或工具可以帮助我完成此过程? 是否“通过一次点击”从重构工具中突破了所有依赖性? =)

听起来像所有这些步骤对于许多开发人员而言是常见的并且是一个常见问题,在我尝试将插件写入Resharper或CodeRush之前,我不得不问,因为有人可能已经尝试过这个...

添加:

反思下面的答案:即使您可能不想一次性突破所有内容(一次点击总突破可能会导致更多问题而不是它有帮助)仍然能够简单地突破1个方法依赖关系,或轻松地突破1-2个依赖关系,会有很大的不同。

此外,重构代码有一个“尝试,看看只是为了学习所有东西是如何组合在一起发生的事情”的衡量标准,并且一键完全突破将有助于这个过程吨,即使你不检查该代码..

我认为没有任何工具可以为您自动化。 使用遗留代码意味着 - 如您所知 - 一次只需几步就可以更改代码。 这些步骤通常都很小,以防止出错。 通常,您应该进行的第一个更改是使该代码可测试的更改。 在编写测试之后,您可以通过修复错误或实现RFC来更改代码的这一部分。

因为你应该采取小步骤,我相信很难使用重构工具神奇地使所有依赖关系消失。 对于遗留系统,您几乎不需要立即进行大的改变,因为破坏的风险(并且由于缺乏测试而没有发现)太大了。 但是,这并不意味着重构工具在这种情况下无用。 反之; 他们帮了很多忙。

如果您还没有,我建议您阅读Michael Feathers的“ 有效使用遗留代码 ”一书。 它详细描述了一系列模式,可帮助您将遗留代码重构为更易测试的系统。

祝好运。

在涉及静态调用依赖项时,您可能需要查看Moles 它能够在运行时执行代码注入,以使用您自己的测试实现来存根任何静态或非虚拟方法调用。 这对于测试未使用可测试的依赖注入接口设计的遗留代码非常方便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM