测试Linq查询EF和存储库模式

本文关键字:存储 模式 EF Linq 查询 测试 | 更新日期: 2023-09-27 17:59:08

相信我,我在SO上读了很多文章和问题。但我还没有找到满意的答案。以Matt Robert关于存储库模式和单元测试的教程为例:

我不明白。两个存储库包含完全相同的查询逻辑吗?看起来是这样的,如果是这样的话,这是一种有用的模式吗?这意味着,每当我在假存储库中更改查询时,我都必须在实际存储库中改变查询逻辑——这听起来像是PITA和问题的解决方案。

我想将查询保留在一个方法中,并测试该方法。后来我想到,我可以这样做:

//Student can be from the db or a fake list
public person GetStudent(IEnumerable<Student> students,int studentid)
{
   return students.FirstOrDefault(s =>s.PersonId ==studentid);
}
//unit test
    Assert.IsNull(GetStudent(fakeStudentList, -1))
//actual code
    var student =  GetStudent(entities.students,-1) 

有没有模仿上面的模式?如果是,那是什么?或者存储库模式实际上就是这样工作的?如果是这样,为什么感觉存储库模式重复代码?

此外,的努力。。看看这个可怕的例子:S?

测试Linq查询EF和存储库模式

没有太多内容,但我认为您的存储库模式存在缺陷。

您不应该将学生集合传递给GetStudent()GetStudent应该是一个类的一部分,该类内部了解学生列表——无论是文件、List、数据库还是其他什么。

因此,您的"伪"存储库可能具有相同的逻辑,或者它只返回硬编码的伪Student。如果你伪造了存储库,我认为这是因为你在测试其他需要存储库的东西,所以它不应该在乎它是如何得到Student的。

此外,您引用的文章只提到了一个存储库,所以我不确定您为什么需要复制它。