我目前有一个项目,我已经开始使用EF4,并且我会回过头来添加单元测试。我正在使用EF4 POCO T4 templates和我的模型(数据库)第一个上下文。我正在为我的DAC逻辑使用通用存储库,并为持久性使用工作单元模式。
但是,我遇到了一些理解如何模拟ObjectContext / ObjectSet的问题。我查看了使用this article中的FakeObjectSet<T>
示例,但它仍然留下了一些内容,例如自动递增身份和事务回滚。
所以,我正在努力寻找一个完全可以进行单元测试的优秀EF设计。
我的问题是,EF4.1 DbSet能解决很多问题吗/单元测试EF4?有没有很好的综合性文章来设计可完全测试的EF4.1解决方案?
另外,请记住我需要一个模型优先解决方案。
提前致谢。
答案 0 :(得分:6)
完全模拟模拟图层的行为不是单元测试的重点。单元测试的要点是相信模拟层只是起作用。单元测试验证测试的方法而不是模拟。您将只验证模拟上的正确方法被调用,如果您的业务逻辑需要一些值,您可能会设置一些回调来修改传递的数据。示例:
您有一种业务方法,将记录插入数据库并在插入后使用实体及其ID。 IObjectSet
模拟将配置为:
AddObject
被调用一次的期望 - 您可以在验证中设置预期的实例AddObject
定义回调,将Id设置为某个值,并在测试后期使用 DbSet
不会有任何区别 - 它只是ObjectSet
的包装,具有类似的行为。在我看来,没有有效的方法可以使模拟行为像真正的EF一样。使用模拟EF +数据库的行为创建模拟所需的工作量将比整个应用程序的工作量大得多!这将不再是模拟它将是伪造的EF提供商。
如果要测试EF代码(映射,查询,持久化)和数据库行为(如自动增量,事务等),则必须编写集成测试。在这里,您有一些相关的问题,讨论存储库,工作单元和测试的挑战: