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

C# 如何对以Lambda表达式为参数的存储库方法进行单元测试,c#,.net,unit-testing,C#,.net,Unit Testing,我有一个存储库方法,如下所示: public ICollection<TEntity> Find(Expression<Func<TEntity, bool>> where) { return Set.Where(where).ToList(); } 公共ICollection查找(表达式,其中) { 返回集.Where(Where.ToList(); } Set是一个实体框架DbSet 使用这种方法进行单元测试的最佳方法是什么?我可

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

 public ICollection<TEntity> Find(Expression<Func<TEntity, bool>> where)
 {
        return Set.Where(where).ToList();
 }
公共ICollection查找(表达式,其中)
{
返回集.Where(Where.ToList();
}
Set
是一个实体框架
DbSet

使用这种方法进行单元测试的最佳方法是什么?我可以模拟
DbSet
来轻松返回一些虚拟数据,但我不能完全确定什么是该方法的有效或有价值的测试

例如,我可以测试返回类型是否正确,以及是否为一个显然永远不会满足的谓词返回了一个空集合,但是我应该运行哪些其他测试


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

当您模拟
集时,
方法中没有其他有效的测试方法。然后,该方法只包含一个mock,仅此而已。如果
Set
只是一个mock,那么调用
Where
也将根据您设置mock的方式返回任何虚拟数据。因此,您实际上是在测试您的模拟是否按照您希望的方式进行模拟,而不是使用从该模拟中检索的数据执行正确操作的方法。由于您对这些数据所做的工作很琐碎(只需在其上调用
ToList
),因此无需在此进行任何测试

但是您应该考虑实际的<代码>表达式<代码>是正确构建的,但是在该方法的测试中您不会这样做,但在调用代码的测试中不会这样做。