【问题标题】:How to Unit Test the Entitiy-Framework (EF) in my business logic?如何在我的业务逻辑中对实体框架 (EF) 进行单元测试?
【发布时间】:2012-06-06 16:26:37
【问题描述】:

我已经阅读了很多关于实体框架单元测试的内容。

我发布这个问题是因为我只是看到这个问题有太多解决方案!

以下是我找到的解决方案:

  1. 使用名为TypeMock(提到here)的昂贵商业工具。
  2. 使用名为 Effort(提到 here)的 alpha 开源工具。
  3. 使用 Repository PatternRhino Mock。针对真实数据库测试隔离的 LINQ 查询(提到 here)。

此处所述的某些方法存在一些问题:

  • 您无法避免需要为 ObjectContext 提供连接字符串的事实
  • 如果您伪造了 ObjectContext - 某些在单元测试中可能有效的东西在生产中将无效(例如在查询中运行函数)

我读过的一些文章是 3-4 年前的。

这里有没有人对此问题有任何经验并且可以帮助我寻求最佳解决方案?

只是为了说清楚: 我的业务逻辑函数不仅仅是像“GetUserById”这样的简单函数。

一些功能包括访问与其他对象有关系的对象。 (例如 - 我可以在同一功能中添加用户 + 部门 + 办公室)。

【问题讨论】:

    标签: entity-framework unit-testing


    【解决方案1】:

    为了做这样的事情,我建议使用存储库模式并使用像 RhinoMOQ 这样的模拟框架来测试您的业务逻辑,然后我会建议您对存储库进行一些集成测试。

    首先,这遵循“单一责任原则”,允许您以几乎相同的开销测试业务逻辑(模拟 ObjectContext 是一种痛苦),它允许您使用真实数据测试您的查询。我强烈声明任何经过良好测试的解决方案都将包括单元测试和集成测试。

    【讨论】:

    • 我从未使用过 Rhino 或 MOQ。你有任何样品可以帮助我吗?我不明白我应该如何将 LINQ 代码与业务逻辑分开。我在哪里放置 'entities.SaveChanges' ?在业务逻辑中?还是在 Rhino\MOQ 测试的部分?如果我在 BL 中的函数有 2 次对数据库的调用 - 一个用于获取项目列表,另一个用于迭代每个项目并执行一些操作?
    • 还有一个问题——您提出的这种方法是否支持延迟加载?我不希望每个数据库调用都执行 '.ToList()',因为它可能会从数据库中带来大量数据...
    • 你不必删除 linq,我会看看使用工作单元模式这里是一个示例:elegantcode.com/2009/12/15/…,它有点旧但概念仍然相同,你把DAL 中的存储库,然后通过工作单元调用它们
    • 我不明白存储库如何帮助我完成测试。而且-您提供的链接中的存储库在“GetAll”函数中有一个“.ToList()”操作。这是有问题的,因为它可能会不必要地将大量信息从数据库转移到我的应用程序!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2011-04-15
    • 2012-01-12
    • 2013-09-14
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多