【问题标题】:Is there any reason to use Mock objects when unit testing an Entity Framework DAL?在对实体框架 DAL 进行单元测试时,是否有任何理由使用 Mock 对象?
【发布时间】:2013-10-01 05:31:08
【问题描述】:

据我了解,Mocking 用于消除对另一个服务的依赖,以便您可以正确测试业务逻辑的执行,而不必担心其他服务是否工作。

但是,如果您要测试的是特定服务(即实体框架),那么针对预设测试数据库的实现式单元测试确实是唯一能告诉您任何有用信息的测试。

我错过了什么吗?模拟在我对实体框架 DAL 的测试中是否有任何位置?

【问题讨论】:

    标签: c# entity-framework unit-testing mocking data-access-layer


    【解决方案1】:

    在我看来,模拟对象与您要测试的层无关。您有一个要测试的组件,并且它具有依赖项(您可以模拟)。所以继续模拟吧。

    【讨论】:

      【解决方案2】:

      可以假设 EF 有效。您将测试与 EF 交互的代码。在这种情况下,您伪造 EF 以测试您的交互代码。

      您基本上不应该测试 EF。交给微软吧。

      【讨论】:

      • 这听起来可能很傻,但这实际上是我需要听到的答案。我的意思是,我有单元测试,基本上只是确保DbContext.Add() 实际上向数据库添加了一些东西。当我发现自己在测试不属于我的代码时,我只需要抓住自己 =)
      • 这是单元测试学习之旅的一部分。 :) 我推荐这本书。 artofunittesting.com
      【解决方案3】:

      你关于嘲笑的断言是正确的:

      Mocking 用于消除对另一个服务的依赖,以便您 可以正确测试业务逻辑的执行,而无需 担心其他服务是否工作。

      用我的话来说:单元测试背后的想法是通过单一方法测试单一代码路径。当该方法将执行移交给另一个对象时,就会产生依赖关系。当控制权传递给未模拟的依赖项时,您不再是 unit testing,而是 integration testing

      数据访问层测试通常是集成测试。正如您推测的那样,您可以利用可预测的数据集来确保您的 DAL 按预期返回结果。我不希望 DAL 有任何需要模拟的依赖项。您测试 DAL 返回的值是否符合您对数据集的预期。

      以上所有内容都表明测试实体框架不是您的责任。如果您发现自己在测试 EF 的工作方式并且没有针对您的特定 DAL 实现创建测试,那么您正在编写错误的测试。换句话说:你测试你的代码,让别人测试他们的。

      最后,三年前我问了一个similar question,得到的答案大大提高了我对测试的理解。虽然与您的问题不同,但我建议您通读回复。

      【讨论】:

        【解决方案4】:

        您可能会考虑的一件事是 EF 可以使用本地文件而不是您的实际存储库,您可以使用连接字符串在两者之间切换。此示例将在 AppData 文件夹或 bin 文件夹中创建 .sdf 文件(如果它是控制台应用程序)。

        <connectionStrings>
        <add name="SecurityContext" 
             connectionString="Data Source=|DataDirectory|YourDBContext.sdf"
             providerName="System.Data.SqlServerCe.4.0" />
        

        当我开始一个项目或测试时,我喜欢这个。您可以使用数据等加载数据库:EF 有一个模拟数据库供您在不接触生产数据的情况下运行测试。

        【讨论】:

        • 您是否通常有一个持久性文件,您使用数据加载一次并在测试后以某种方式恢复到其原始状态,或者您是否有您的集成测试设置它,测试它,每次都销毁它?
        猜你喜欢
        • 1970-01-01
        • 2012-10-19
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多