【问题标题】:EF4.1 DbSet vs. EF4 ObjectContext and Unit TestingEF4.1 DbSet 与 EF4 ObjectContext 和单元测试
【发布时间】:2011-06-20 15:22:39
【问题描述】:

我目前有一个使用 EF4 开始的项目,并且在事后返回并添加单元测试。我将EF4 POCO T4 templates 与我的模型(数据库)第一个上下文一起使用。我正在为我的 DAC 逻辑使用通用存储库,并为持久性使用工作单元模式。

但是,我在理解如何模拟 ObjectContext/ObjectSet 时遇到了一些问题。我查看了使用来自this articleFakeObjectSet<T> 示例,但它仍然遗漏了一些内容,例如自动递增身份和事务回滚。

所以,我正在尝试找到一个仍然可以完全单元测试的良好 EF 设计。

我的问题是,EF4.1 DbSet 是否解决了很多与单元测试 EF4 相关的问题?有没有什么好的综合文章来设计完全可测试的 EF4.1 解决方案?

另外,请记住,我需要一个模型优先的解决方案。

提前致谢。

【问题讨论】:

    标签: unit-testing entity-framework entity-framework-4 entity-framework-4.1


    【解决方案1】:

    完全模拟模拟层的行为不是单元测试的重点。单元测试的重点是相信模拟层可以正常工作。单元测试验证被测试的方法而不是模拟。您只需验证是否调用了模拟上的正确方法,并且如果您的业务逻辑需要一些值,您可能会设置一些回调来修改传递的数据。示例:

    您有一个将记录插入数据库并在插入后使用实体及其 ID 的业务方法。 IObjectSet 模拟将被配置为:

    • 设置期望 AddObject 仅被调用一次 - 您可以在验证中设置期望实例
    • 您可以为AddObject 定义回调以将 Id 设置为某个值并在稍后的测试中使用它

    DbSet 不会有任何区别 - 它只是 ObjectSet 的包装,具有类似的行为。在我看来,没有有效的方法可以让模拟表现得像真正的 EF。使用模拟 EF + 数据库的行为创建 mock 所需的工作量将比整个应用程序的工作量大得多!那将不再是模拟的,它将是假的 EF 提供者。

    如果您想测试您的 EF 代码(映射、查询、持久化)和数据库行为(如自动增量、事务等),您必须编写集成测试。在这里,您有一些相关问题讨论存储库、工作单元和测试挑战:

    【讨论】:

    • 感谢您的回复,这很有意义。我对 TDD 相当陌生,所以其中一些概念仍在深入人心。你的帖子帮助我把很多事情结合在一起。
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2011-07-07
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多