2009-08-17 42 views
9

我通过方法链创建了一些小流利的接口。他们通常会调用一些从Web服务/数据库获取数据的存储库。如何对使用Fluent界面的代码进行单元测试?

我应该如何去使用流利接口的单元测试方法?

Public IEnumberable<Computer> FindComputers(string serialNumber) 
{ 
     return Computers.FindBySerialNumber("YBCX00900") 
     .AttachConfiguration() 
     .EnsureAllComputersHaveConfiguration(); 
} 

我可以单元测试流畅界面的各个组成部分,但如果我想单元测试上面我应该怎么做FindComputers方法?

  1. 使用具体实现流畅的界面,并且写上库类
  2. 模拟流利的接口本身 期望和设置该
  3. 测试只有一口流利的接口本身的预期,而不是FindComputers ()方法

我想找到一个易于维护的方法。

回答

3

我认为金融衍生工具做得比需要的多。我假设你使用计算机作为数据映射器,并将其用于构建查询。从你出什么查询从此建立起来:

rule 1: find configured computer with serial number = "whatever" and has-config = true. 
rule 2: find not-config computer with serial number = "whatever and has-config = true. 
rule 3: find configured computer with serial number = "whatever" and has-config = false. 
rule 4: find not-config computer with serial number = "whatever" and has-config = false. 
rule 5: find all computer with serial number = "whatever" and has-config = true. 
rule 6: find all computer with serial number = "whatever" and has-config = false. 

等等...

现在其中的一些规则,可以实现似乎是不正确的。规则2和规则3似乎是交叉的目的。规则5和规则6做什么?这是对的吗?

因为你已经实现了一个打破SRP的对象。第一步是从数据映射器中分解查询生成器。建立您的FI查询对象,然后将其传递给映射器。

现在您可以测试FindComputers确保FI查询对象被发送到数据映射器。因为你现在可以建立一个FI查询对象,所以你可以测试它。您可以测试数据映射器使用查询对象。

如果将来想要按位置查找计算机,该怎么办?如果你保留与你写的相同的代码,你将不得不添加一个方法FindByLocation并且在你知道它之前你有一个上帝对象。臭!

+0

谢谢,你是对的,这个例子很糟糕,我已经把FI分解成一个用于查询,另一个用于对返回的数据执行操作。 我发现最简单的方法是单元测试FI,然后使用FI和具体实现的单元测试方法。只是测试,返回所需的结果。 试图模拟FI只会使测试过于脆弱。 – Andronicus 2009-08-19 22:15:37

0

我会做2 + 3。假设流畅的接口是真正的接口,它们应该相对简单地模拟。只要意识到调用链中的每一步都应该返回一个新的模拟对象,这又会期待链中的下一个调用。

您仍然应该直接测试流畅接口,嘲笑它们下方的存储库层。

+0

感谢您的输入, 我想到了嘲讽流畅的界面本身,但它只是似乎很奇怪,写测试,如... 期待(X => x.FindBySerialNumber(空))。返回(nextMock) 期望(x => x.AttachConfiguration())。返回(nextMock) 当它测试的全部内容是调用实际进行时。在模拟对象中重新创建整个流畅接口是很多工作,只是为了测试已经清楚写在被测方法中的内容。 – Andronicus 2009-08-17 22:42:42

+0

我是新来做单元测试的,并且有时会遇到同样的问题。虽然易于通过检查来检查代码,但这仍然是人工审查。当你不再考虑这门课的时候,增加测试范围有助于保护你。这也可能表明流畅的界面比需要的更复杂 - 如果界面更关注于你所需要的测试,写起来也会更简单。 – 2009-08-17 23:10:21

1

你能嘲笑你的仓库吗?虽然有些人会主张采用更纯粹的方法,您必须隔离一个类的一种方法,但这将是测试FindComputers和流畅接口如何协同工作的体面方式。这可能更简单,取决于Repository访问层的外观。

相关问题