如何对使用Fluent界面的代码进行单元测试?

And*_*cus 9 .net c# unit-testing fluent-interface

我通过方法链创建了一些小的流畅接口.它们通常调用许多从Web服务/数据库获取数据的存储库.

我该如何进行使用流畅界面的单元测试方法?

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

我可以对流畅的界面的各个组件进行单元测试,但如果我想对上面的FindComputers方法进行单元测试,我该怎么办?

  1. 使用fluent接口的具体实现,并在Repository类上编写期望
  2. 模拟流畅的界面本身并设定期望
  3. 仅测试流畅的界面本身,而不是FindComputers()方法

我想找到一种易于维护的方法.

Gut*_*ter 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.
Run Code Online (Sandbox Code Playgroud)

等等...

现在这些可以实施的规则中有些似乎是不正确的。规则 2 和规则 3 似乎是相互矛盾的。规则5和规则6的作用是什么?这大约是对的吗?

因为您已经实现了一个破坏 SRP 的对象。第一步是从数据映射器中分离查询构建器。构建您的 FI 查询对象,然后将其传递到映射器中。

现在您可以测试FindComputers,确保 FI 查询对象发送到数据映射器。因为您现在可以构建 FI 查询对象,所以您可以对其进行测试。您可以测试数据映射器是否使用查询对象。

如果将来您想按位置查找计算机怎么办?如果您保留与编写的代码相同的代码,则必须添加一个FindByLocation方法,并且在您意识到之前您就拥有了一个上帝对象。臭!