2010-03-09 118 views
1

当前正在阅读Roy Osherove的“单元测试的艺术”。我大概过了一半,到目前为止这是一本很棒的书。我要请大家离开这个讨论中的IOC集装箱。他只是简单地提到他们(实际上国家奥委会超出了我不了解的这本书的范围,并且是我批评这本书的少数几个地方之一)。无论如何,国际奥委会抛开各种技术:依赖打破技术使用依赖关系Inj进行单元测试

  1. 构造器注入
  2. 物业注射
  3. 软件工厂和静
  4. 软件工厂和虚拟方法
  5. 方法注入
  6. 列表项

好的,我会介绍一下我的东西不喜欢上面的每种方法。
1. 构造函数注入 - 使对象初始化变得困惑和困难,特别是如果您必须传递大量依赖关系。
2. 物业注入 - 罗伊似乎喜欢这种技术,但它是我最不喜欢的。如果你有一堆依赖关系,那么用户必须记得初始化这个类所需的每一个依赖关系。我会说这是容易出错和混乱的。使课堂非常难以初始化不熟悉它的人。
3. 软件工厂和静力学 - 虽然我不认为是坏的技术,我不喜欢依赖状态。我喜欢处理完全无状态的对象,但到目前为止,我认为它是最好的技术。
4. 软件工厂和虚拟方法 - 类似于上述技术,但允许您从类继承,并且只覆盖设置依赖项并将其更改为存根的函数。我的想法与3相似 - 对于试图找出单元测试失败原因的人来说,它有点让人感到困惑。
5. 方法注入 - 我只能说ewwwwwww ...传递每个你调用的方法的每一个依赖。说够了。

我想到了另一种我比上面列出的每种方法都更喜欢的方式。我通常不会鼓励有条件的编译,但我认为在少数几个轻松使用它的地方,它可能是有道理的。我的建议是标准化一个方法的名称,为你的测试设置你的依赖关系。例如:

.InitalizeDepForTesting(IFileSystem file, IDatabase data, IEventLog event, ...) 

然后包裹上面的语句在条件编译声明:

#If DEBUG 
     public void InitializeDepForTesting(...) 
#endIf 

所以内部的依赖继续工作的是,不需要改变。你也可以避免把构造函数弄糟,并把所有的依赖关系传给一堆其他的“东西”。就生产代码而言,没有任何变化,一眼就可以很容易地看到如何初始化对象以进行测试。你们都在想什么?

+1

如果你真的拼写出所有的单词,你的问题会更容易阅读。例如:“条件补偿”。什么是“comp”?计算?汇编?还有别的吗? – 2010-03-09 19:19:01

+1

好吧我会做一些编辑 – coding4fun 2010-03-09 19:22:06

回答

2

a。)我与PicoContainer人群就此:ConstructorInjection是要走的路。清晰的语义和明确的执行。

b。)关于您的测试方法:我更喜欢使用Mocks,然后依靠IOC进行对象组装。

4

施工注塑是更清晰的选择,因为它清楚地确定了你的依赖关系。如果它们太多且令人困惑,那可能表明您的设计存在问题。

+0

我想我想在棕色的情况下,当你试图分解代码,所以它可以进行测试,尤其是如果你的变化构造函数在很多地方使用。在某些情况下,这将是痛苦的。当然,如果你从一开始就设计代码,应该很容易测试,但这不是很多次。对于我想出来的解决方案而言,这种改变是最小的。 – coding4fun 2010-03-09 19:28:19

+1

我同意这将是最小改变的解决方案,但我质疑测试最终如何有效。让我们知道... – 2010-03-09 19:32:07

4

基于构造函数的注入似乎是社区中的明显赢家(并且是我使用的唯一方法)。

你问IoC会从讨论中删除,但这就像要求我们讨论用记事本编写.Net代码一样。当然可以做,但你为什么想要?正确使用时,IoC容器通常允许您在运行时通过一次调用来构建整个应用程序。从这一点开始,您的所有实例都可以正确设置正确的依赖关系。这甚至没有提到所有使用汽车模拟进行单元测试的工作。

正如别人指出,如果你有这么多的依赖关系,你的构造函数令你感到困惑,那么你真的需要重新考虑你的设计。在你读完罗伊的优秀书籍后,我建议你拿起一本鲍勃叔叔的“清洁代码”。

+1

采取点。只是试图创造一个打破依赖于我还不是所有人都熟悉的东西:P。我理解这些概念,但这是关于它的。读完这本书之后,可能会去玩构造图。雅“清洁代码”在我的名单上,还有一些其他人喜欢“有效地使用遗留代码”(非常重要,我工作的地方)。 – coding4fun 2010-03-09 19:38:10

+1

@ user127954 - 你提到的两本书都非常出色。 “有效地工作......”将涵盖您在另一条评论中提出的问题(“当你试图分解代码以便测试时,这是一个棕色域的案例”)。 – TrueWill 2010-03-09 20:40:31

0

我打算要求所有人离开IOC 集装箱。

通过这样做会产生问题。 我理解你的推理,但是,全部如果你考虑适当的国际奥委会,你的异议将变得没有意义。