如何对以 Lambda 表达式为参数的存储库方法进行单元测试

How to Unit Test Repository Method That Takes Lambda Expression as A Parameter

我有一个存储库方法如下:

 public ICollection<TEntity> Find(Expression<Func<TEntity, bool>> where)
 {
        return Set.Where(where).ToList();
 }

Set 是一个 EntityFramework DbSet<TEntity>

对此方法进行单元测试的最佳方法是什么?我可以轻松地将 DbSet<TEntity> 模拟为 return 一些虚拟数据,但我不完全确定什么构成了此方法的有效或有价值的测试。

例如,我可以测试 return 类型是否正确,并且空集合被 returned 用于显然永远不会满足的谓词,但我还应该进行哪些其他测试是 运行?

我是否应该编写一个测试来传递始终为真的表达式以测试真条件,而另一个测试通过始终为假的表达式来测试假条件?

当您模拟 Set 时,方法中没有更多内容可以有效地 可以 进行测试。然后该方法仅包含模拟,仅此而已。如果 Set 只是一个模拟,则对 Where 的调用也会 return 根据您设置模拟的方式的任何虚拟数据。所以你实际上是在测试你的模拟是否按照你想要的方式被模拟,而不是你的方法用从那个模拟中检索到的数据retrieved 做正确的事情。由于您对这些数据所做的操作很简单(只需对其调用 ToList),因此无需在此处进行任何测试。

但是你应该考虑到实际的 Expression 是正确构建的,但是你不会在该方法的测试中这样做,而是在 调用[=22= 的测试中这样做]代码。