2011-04-08 69 views
1

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

我正在实施分支查找程序。我有一个返回Branch对象,它具有的各种信息,如

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

我有我有一个仓库的仓库伪造为始终返回Branch对象的已知序列,我需要测试我的BranchFinder服务中的逻辑。

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

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

知道搜索是要操作的数据,我可以放心地指定位置和产品规范,并知道会发生什么,但我怎么断言顺序是正确的。

例如

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

我知道该数据的某个子集应按照一定的顺序返回,也即:当您在结果集中迭代从当前位置到分支的距离应增加此给出查询。

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

回答

1

我会做的第一件事就是确保您通过接口ILocatorService访问服务。还要确保它的任何下游依赖关系都可以通过接口使用分支信息(这样您可以稍后在测试中注入Mock)。另外,要清楚你正在测试ILocatorService本身(以确保你在服务中做的任何修改都会破坏它)。

对于ILocatorService使用,你可以使用RhynoMocks返回结果集的任何依赖关系(它可能会去到DB或一些其他供应商的应用程序给我们的分支列表)

这样,你的投入ILocatorService撑你正在测试的唯一一件事情是,如果你已经改变了任何逻辑,就会破坏现有的测试/功能。

+0

这就是我正在做的。我想知道的是最好的方式来断言结果是正确的。我应该按照@Ricardo的建议逐项完成,还是有更好的方法? – 2011-04-08 10:20:43

+1

@Ricardo的方式也不错。你coudl使用Enumerable.SequenceEqual(),如果你想,但你必须实现IEqutable比较2分支对象 – 2011-04-08 10:26:13

1

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

相关问题