当前正在阅读Roy Osherove的“单元测试的艺术”。我大概过了一半,到目前为止这是一本很棒的书。我要请大家离开这个讨论中的IOC集装箱。他只是简单地提到他们(实际上国家奥委会超出了我不了解的这本书的范围,并且是我批评这本书的少数几个地方之一)。无论如何,国际奥委会抛开各种技术:依赖打破技术使用依赖关系Inj进行单元测试
- 构造器注入
- 物业注射
- 软件工厂和静
- 软件工厂和虚拟方法
- 方法注入
- 列表项
好的,我会介绍一下我的东西不喜欢上面的每种方法。
1. 构造函数注入 - 使对象初始化变得困惑和困难,特别是如果您必须传递大量依赖关系。
2. 物业注入 - 罗伊似乎喜欢这种技术,但它是我最不喜欢的。如果你有一堆依赖关系,那么用户必须记得初始化这个类所需的每一个依赖关系。我会说这是容易出错和混乱的。使课堂非常难以初始化不熟悉它的人。
3. 软件工厂和静力学 - 虽然我不认为是坏的技术,我不喜欢依赖状态。我喜欢处理完全无状态的对象,但到目前为止,我认为它是最好的技术。
4. 软件工厂和虚拟方法 - 类似于上述技术,但允许您从类继承,并且只覆盖设置依赖项并将其更改为存根的函数。我的想法与3相似 - 对于试图找出单元测试失败原因的人来说,它有点让人感到困惑。
5. 方法注入 - 我只能说ewwwwwww ...传递每个你调用的方法的每一个依赖。说够了。
我想到了另一种我比上面列出的每种方法都更喜欢的方式。我通常不会鼓励有条件的编译,但我认为在少数几个轻松使用它的地方,它可能是有道理的。我的建议是标准化一个方法的名称,为你的测试设置你的依赖关系。例如:
.InitalizeDepForTesting(IFileSystem file, IDatabase data, IEventLog event, ...)
然后包裹上面的语句在条件编译声明:
#If DEBUG
public void InitializeDepForTesting(...)
#endIf
所以内部的依赖继续工作的是,不需要改变。你也可以避免把构造函数弄糟,并把所有的依赖关系传给一堆其他的“东西”。就生产代码而言,没有任何变化,一眼就可以很容易地看到如何初始化对象以进行测试。你们都在想什么?
如果你真的拼写出所有的单词,你的问题会更容易阅读。例如:“条件补偿”。什么是“comp”?计算?汇编?还有别的吗? – 2010-03-09 19:19:01
好吧我会做一些编辑 – coding4fun 2010-03-09 19:22:06