加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何对实体框架进行单元测试?

发布时间:2020-12-15 08:35:35 所属栏目:百科 来源:网络整理
导读:我试图首先使用EntityFramework代码测试我的代码.为了使其可测试并允许隔离测试,我创建了一个我的DbContext实现的接口.我没有测试DbContext类 – 我将假设EF代码按预期工作. 现在,请考虑以下方法: public IEnumerableUser GetOddId(){ return context_.User
我试图首先使用EntityFramework代码测试我的代码.为了使其可测试并允许隔离测试,我创建了一个我的DbContext实现的接口.我没有测试DbContext类 – 我将假设EF代码按预期工作.

现在,请考虑以下方法:

public IEnumerable<User> GetOddId()
{
    return context_.Users.Where((u,i) => i % 2 == 1).AsEnumerable();
}

这个方法将通过我的模拟FakeDbSet传递(因为它将使用内存中的LINQ提供程序),而在使用EF / LINQ to SQL驱动程序时它会因异常而失败.

你会不会留下它并希望人们知道不要写这样的问题?你会放弃隔离测试并测试实际的数据库吗?

具有DataMigrations的LocalDb(可能带有适当的种子)是否有助于对实际数据库进行测试?

请证明答案是正确的.

TLDR:如何测试EntityFramework代码,考虑内存LINQ和SQL LINQ之间的差异?

很久以后编辑:我发现了一个非常好的框架,完全符合我的需要.我写了一篇关于unit testing with Effort的博客文章.另外请注意即将到来的EF6可能不需要这些,它承诺了一些单元测试功能.

解决方法

为此,我们使用SQLite的内存数据库.它们可以非常快速地创建,查询和拆除,并且几乎不会对整体测试速度产生任何影响.一旦您为自己设置了一个测试框架来创建数据库并注入数据,就可以快速编写测试.

当然,SQLite是一个比大多数人简单得多的数据库,因此复杂的查询可能无法转换为其SQL版本,但是为了测试90%的情况,它运行良好.

这些测试是否构成集成测试?我不这么认为.它们仍然只测试一个代码单元,即生成LINQ查询的位.您正在测试两件事:1)查询返回正确的数据(但您可以使用内存中的集合检查这一点),以及2)查询可以由Entity Framework转换为有效的SQL.测试后者的唯一真正方法是在真实的实体框架中使用存根数据库触发查询.

虽然你可以说真正的单元测试应该只测试你的代码的输出(即解析和检查已生成的表达式树),以及更难写,但它并没有真正证明什么.例如,如果您修改代码以生成内部联接而不是子查询,您是否希望测试中断?只有当它返回不同的结果时,我才会想到.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读