对一系列复杂对象进行单元测试的正确方法是什么

时间:2011-04-08 09:46:10

标签: c# .net unit-testing .net-3.5 nunit

对返回一系列复杂对象的方法进行单元测试的正确方法是什么?

我正在实施分支查找器。我有一个存储库,它返回一个Branch对象,它有各种信息,如

  • 分行名称
  • 地址
  • 位置
  • 库存产品

我有一个我伪造的存储库,总是返回一个已知的Branch对象序列,我需要测试BranchFinder服务中的逻辑。

Find方法采用Flags枚举形式的位置(纬度/经度)和产品规格。

public IEnumerable<Branch> Find(Location location, Products products);

了解搜索将要运行的数据,我可以安全地指定位置和产品规格,知道会发生什么,但我如何断言序列是正确的。

e.g。

var loc = new Location(53.79424, -1.546112);
var results = service.Find(loc, Products.Milk | Products.Bananas);

我知道这个给定的查询应该按特定顺序返回某个数据子集,并且当你遍历结果集时,从当前位置到分支的距离应该增加。

测试这些规则和情况的正确/最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您知道从Find方法中检索了多少结果,您可以转换为列表或数组并检查每个位置以检查Branch对象是否具有正确的值,这就是我的方法。

答案 1 :(得分:1)

我要做的第一件事就是确保您通过界面ILocatorService访问服务。还要确保它具有的任何下游依赖关系也可以通过接口使用分支信息(以便您可以在测试中稍后注入Mock)。

另外,要明确您正在测试ILocatorService本身(以确保您在服务中所做的任何更改都会破坏它)。

对于ILocatorService使用的任何依赖项,您可以使用RhynoMocks返回结果集(它可能会转到DB或其他供应商应用程序以向我们提供分支列表)

这样你对ILocatorService的输入保持不变,你唯一要测试的是你所改变的逻辑是否破坏了existign测试/功能。