现在,请考虑以下方法:
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是一个比大多数人简单得多的数据库,因此复杂的查询可能无法转换为其sql版本,但是为了测试90%的情况,它运行良好.
这些测试是否构成集成测试?我不这么认为.它们仍然只测试一个代码单元,即生成LINQ查询的位.您正在测试两件事:1)查询返回正确的数据(但您可以使用内存中的集合检查这一点),以及2)查询可以由Entity Framework转换为有效的sql.测试后者的唯一真正方法是在真实的实体框架中使用存根数据库触发查询.
虽然你可以说真正的单元测试应该只测试你的代码的输出(即解析和检查已生成的表达式树),以及更难写,但它并没有真正证明什么.例如,如果您修改代码以生成内部联接而不是子查询,您是否希望测试中断?只有当它返回不同的结果时,我才会想到.
原文地址:https://www.jb51.cc/csharp/244138.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。