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

标签 c# .net unit-testing fluent-interface

我已经通过方法链创建了一些小的流畅接口(interface)。他们通常会调用许多从网络服务/数据库中获取数据的存储库。

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

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

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

  1. 使用流式接口(interface)的具体实现,并编写 对存储库类的期望
  2. 模拟流畅的界面本身并设定预期
  3. 仅测试 Fluent 接口(interface)本身,而不测试 FindComputers() 方法

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

最佳答案

我认为 FI 所做的超出了它的需要。我假设您将 Computers 用作数据映射器,并将其用于构建查询。根据您所显示的内容,查询是由此构建的:

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 并且在您知道它之前您已经拥有了一个上帝对象。好臭!

关于c# - 如何对使用 Fluent 界面的代码进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1290750/

相关文章:

c# - 具有很多 if else block 的功能。这些可以去掉吗

c# - DataTable Select 与 List<T> LINQ 性能

.net - 添加对 GAC 的 DLL 的 Web 引用

c# - 如何在插件中使用 NLog

java - 如何模拟具有功能接口(interface)参数的方法?

c# - 重定向到新的 LoginPage 失败

c# - 在 Windows 窗体 C# 上打开 Word (.docx) 文件

c# - c#中的接口(interface)和委托(delegate)是什么?

c# - 模拟存储过程的输出参数

java - 如何为 DirectoryStream 编写 junit 测试