我已经通过方法链创建了一些小的流畅接口(interface)。他们通常会调用许多从网络服务/数据库中获取数据的存储库。
我应该如何进行使用流畅界面的单元测试方法?
Public IEnumberable<Computer> FindComputers(string serialNumber)
{
return Computers.FindBySerialNumber("YBCX00900")
.AttachConfiguration()
.EnsureAllComputersHaveConfiguration();
}
我可以对流畅界面的各个组件进行单元测试,但是如果我想对上面的 FindComputers 方法进行单元测试,我应该怎么做?
- 使用流式接口(interface)的具体实现,并编写 对存储库类的期望
- 模拟流畅的界面本身并设定预期
- 仅测试 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/