jle*_*lew 1 .net unit-testing entity-framework mocking repository-pattern
我有一个很好的解耦应用程序和依赖注入的应用程序,它使用Entity Framework 4.1 CodeFirst通过存储库模式公开IQueryable.在测试存储库客户端时,很容易模拟底层数据存储区,但是没有捕获到某类错误:
存储库客户端可以自由地在存储库返回的内容上层叠自己的LINQ谓词,联接等:
{
_myRepository.FindAll().Where( x => x.Id == 3 && SomeMethod(x.Name) == "Hello" );
}
Run Code Online (Sandbox Code Playgroud)
这种查询将在模拟_myRepository的单元测试中成功,因为mock返回内存中的实体集合,而LINQ-to-Objects很乐意调用方法"SomeMethod".它将对真正的数据存储失败,因为"SomeMethod"不会转换为LINQ-to-Entities中的SQL.
我试图找出一种方法,我可以模拟数据集,并导致真正的EF查询提供程序生成(但不执行)SQL.为什么?因为测试应该很快,我不希望它们尽可能地打到真正的数据库.生成SQL将清除这样的翻译问题.
到目前为止,我还没有弄清楚如何做到这一点,因为在我的单元测试中,我最终无法控制查询何时实现.我想我需要提供我自己的IQueryable版本和各种LINQ Queryable扩展方法,或尝试通过提供程序机制挂钩(使用几年前做缓存/跟踪提供程序的示例.)这些似乎很多工作.关于如何实现这一点的任何想法?
| 归档时间: |
|
| 查看次数: |
1993 次 |
| 最近记录: |