2010-06-30 72 views
11

使用旧代码并尝试创建测试时,我经常从类或方法中分离出依赖关系,因此我可以使用mock编写这些依赖关系的单元测试。依赖关系通常以调用静态类和对象的形式出现,这些静态类和对象是使用构造函数中的new关键字或该类中的其他位置创建的。最简单,最快的方式来打破类的所有依赖关系

在大多数情况下,静态调用是通过包装静态依赖来处理的,或者如果它的一个单例模式(或类似的)以StaticClass.Current.MethodCall()的形式传递该依赖, 。

在大多数情况下,构造函数中new关键字的使用仅仅是通过在构造函数中传递该接口来替换。

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

我总是使用Resharpers重构工具来帮助我解决所有这些问题,但大多数情况仍然是手工劳动(可能是自动化的),对于一些遗留类和方法来说,这可能是一个非常单调乏味的过程。有没有其他的重构插件和/或工具可以帮助我在这个过程中?是否有“通过单击”突破这个类的所有依赖性?“重构工具? =)

对我来说,听起来像所有这些步骤是很多开发人员和常见问题的常见问题,并且在我尝试将插件写入Resharper或CodeRush之前,我不得不问,因为有人可能已经尝试过这种方法。

新增:

在反射到下面的答案:即使你可能不希望打破眼前的一幕(点击总量突破了可能会导致更多的问题比它帮助)仍然能够简单地打出来1个方法依赖关系,或者1-2个依赖关系很容易,会有很大的不同。

此外,重构代码有一个“尝试看看会发生什么事情,只是为了学习如何将所有东西放在一起”,并且一次点击就可以帮助处理吨,即使你不检查代码。

+0

除了下面提到的遗留代码现在的经典工作方式,您可能会发现.NET中的Brownfield应用程序开发有趣:http://www.manning.com/baley/ – AakashM 2010-06-30 14:49:53

回答

3

我不认为有任何工具可以自动执行此操作。使用遗留代码意味着 - 一如你所知 - 一次只用很少的步骤更改代码。这些步骤通常故意很小以防止出现错误。通常,你应该做的第一项改变是使代码可测试的改变。在您编写测试之后,您可以通过修复该错误或实现RFC的方式来更改该部分代码。

因为你应该采取一些小步骤,我相信很难使用重构工具来神奇地让你所有的依赖消失。对于遗留系统,您几乎不希望立即做出重大更改,因为破坏(而不是因为缺少测试而发现)的风险太大。然而,这并不意味着重构工具在这种情况下没有用处。反之;他们帮助很大。

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

祝你好运。

+0

我实际上即将阅读那本书!在你的回答中有很多真相,所以+!尽管你可能不想一下子把所有东西都分解出来(一次点击就可能导致更多的问题,而不是它的帮助),但仍然能够简单地分解1个方法依赖关系或者1-2个依赖关系差别很大。 此外,重构代码有一个“尝试看看发生了什么只是为了学习如何将所有东西放在一起”的措施,并且一次点击总计突破将帮助处理吨,即使你不检查代码。 – MatteS 2010-06-30 14:44:58

+0

有现在阅读这本书,我仍然会发现这样一个工具很有用,尽管我可能不想检查代码。但是简单地概述一下现有的依赖关系是非常有用的。每个方法,每个类,或任何我需要更改的代码部分,从而编写测试。此外,阅读这本书也给了我很多关于这个工具如何真正可以帮助用可选方法实际分解依赖关系的想法.. – MatteS 2011-05-24 08:50:06

+0

@MatteS:看看NDepend。它允许您可视化系统各部分之间的依赖关系。 – Steven 2011-05-24 11:19:00

1

说到静态调用依赖关系,您可能需要检出Moles。它能够在运行时进行代码注入,以便用您自己的测试实现去除任何静态或非虚拟方法调用。这对于测试未使用可测试依赖注入接口设计的遗留代码来说非常方便。

相关问题