我对单元测试真的很陌生,尽管我在研究上花了很多时间,但我无法找出适合我的情况的正确方法。
我的代码库很大(大约 3 年的工作),不幸的是,耦合度很高,很难测试,也没有对其进行过单元测试。
因此,例如,当尝试测试一个集合类ProductCollection
时,更具体地说,bool MoveElementAtIndex(Product productToMove, int newIndex)
它的,我遇到了以下问题:
- 首先我必须初始化这个
new ProductCollection()
- 构造函数初始化另一个手工类:
new KeyedList<ID, Product>
. 我想这不应该在这个构造函数中调用,因为我不是在测试KeyedList
. - 接下来,我正在尝试向其中添加 3 个产品
ProductCollection
。 - 然后我首先创建这些 3
new Product()
。 - 但是
Product
类的构造函数做了几件事 - 它为新创建的产品计算一个唯一 ID:
this.ID = IDUtils.ComputeNewIDBasedOnTheMoonPhase()
。我想我也不应该测试这个,因为它不是我的范围。我应该如何避免这种深度的调用? - 相同的 Product 构造函数为此产品分配了一些默认属性:
this.Properties = new ProductProperties(folderPathToDefaultProperties)
. 这不应该从我的简单FieldCollection.MoveElementAtIndex
测试中调用,对吧? - 假设我现在终于有了我的产品对象,我正在尝试将它们添加到我的收藏中。
- 但
ProductCollection.Add(MyProduct)
检查底层证券是否KeyedList
已经包含该产品。这也是我应该避免的业务逻辑,与我的测试无关。问题是如何? - 此外,在这种
Add
方法中,会引发一些事件,通知系统一些事情(例如,新产品已添加到集合中)。我想这些也不应该被解雇。 - 最后,当我添加了我的产品时,我调用了所需的 SUT:移动元素方法。
- 但是这个方法也有可能超出我的测试范围的逻辑:它验证底层
KeyedList
实际上包含这些字段,它调用KeyedList.Remove()
,KeyedList.Insert()
为其移动逻辑,并触发像CollectionModified
.
如果您能解释一下如何正确地进行此单元测试,如何避免调用底层对象,我将不胜感激。
我正在考虑微软的 Moles 框架(VS2010),因为我的印象是它不需要我重构所有东西,因为这绝对不是一个选择。但是已经尝试过了,仍然找不到合适的使用方法。
另外,我的印象是,这个具体的例子对我的情况有很多帮助,因为现实世界中的代码通常是这样的。
有什么想法吗?