【问题标题】:Using mocking during testing does it worth the effort?在测试期间使用模拟是否值得付出努力?
【发布时间】:2010-02-19 15:01:32
【问题描述】:

在这个学期,我的教授试图说服我们为什么在开发过程中使用单元测试是好的,为什么验证数据是好的(微软应用程序块),他还告诉我们使用模拟(RhinoMocks)来测试我们的当我们无法访问数据库时的方法。

我必须使用模拟进行一些单元测试,为了使它们工作,我必须手动创建测试我的方法所需的对象层次结构(我花了一段时间来编写我需要的所有内容)。

我想提出的问题:在生产中使用模拟有用吗?每次有机会我都应该使用它吗?还有,为了用 mock 测试一个方法而编写所有内容的努力是否得到了回报?

谢谢

【问题讨论】:

  • 重复“为什么要创建模拟对象?” (stackoverflow.com/questions/1414032/why-create-mock-objects)。索林,你应该检查一下这个问题——它有几个很好的答案。话虽如此,模拟框架很容易为我节省了数十(可能数百)小时。
  • 谢谢杰夫,阅读这个问题的答案真的很有用!

标签: .net unit-testing mocking


【解决方案1】:

是的,使用模拟对象作为其中一个您的众多单元测试工具绝对是一项值得的尝试。

不过,最好使用测试驱动开发,因为测试驱动设计。当您因为必须维护深度嵌套的结构而开始感受到紧耦合代码的痛苦时,您就知道是时候重构为更松耦合的 API了。

【讨论】:

  • TDD 也是本学期课程中讨论的主题。我发现很难不跳过指定的步骤。因此,简而言之,在测试(TDD、模拟)时,我需要感觉自己是水中的鱼才能成长。
  • “众多单元测试工具之一”。只是出于兴趣,除了 RhinoMocks 和 msTest/nUnit 之外,您还使用了哪些其他工具来帮助您进行测试??
  • 我的 UT 堆栈是 xUnit.net、Moq 和 AutoFixture。添加为特定情况创建的任何自定义“工具” - 这是一个示例:blog.ploeh.dk/2009/08/06/…
【解决方案2】:

Mocks 解决了以下问题:

  • 没有它们,您的测试就会结束 测试多于你的代码 测试。所以如果有bug 将被标记的依赖项 在你的测试中(或者更糟糕的是,它可能 掩盖代码中的错误)
  • 集成点可能会返回 写作时的不同结果 测试与运行测试的时间相比,由于 外部 依赖改变(想想 - 改变 数据库状态)
  • 与集成时 外部系统你的测试会运行很多 较慢。这会导致其他 开发人员减少运行它们的频率,并且 因此降低你的价值 测试
  • 如果使用得当,它们会产生 测试更容易阅读和意图 你的模块更明显。

【讨论】:

    【解决方案3】:

    这个没有正确的答案。模拟框架(如 RhinoMocks)可以做一些强大的事情。我个人的选择是我喜欢滚动自己的模拟对象。如果我觉得这很难,我会​​把它当作我的设计有问题的气味。

    当设置单元测试非常困难或需要大量代码时,我会在遗留代码上使用模拟。

    我接受在使用模拟框架方面我可以学到更多东西。

    【讨论】:

      【解决方案4】:

      对于我当前的项目,大部分时间我仍然为我的单元测试编写存根对象。只有一次我真的觉得需要一个模拟对象并手动编写它。

      我想建议您非常务实地接受这一点:如果您需要大量模拟对象,请考虑学习一个模拟框架(当然这也是有代价的),否则使用存根对象或您偶尔的手写模拟对象。

      【讨论】:

        【解决方案5】:

        我不确定 RhinoMocks 是否具有相同的功能,但使用 moq 您可以从对象层次结构中获得所需的内容,而无需实际创建它。

        即。如果您的方法接受 IUser 并且需要访问 IUser.Person.ContactInfo.PhoneNumbers.BusinessPhone 您不需要创建整个图表。你只需要这样做:

        var mockUser = new Mock(); mockUser.Setup(u => u.Person.ContactInfo.PhoneNumbers.BusinessPhone).Returns("555-1212");

        这可能很有价值,但也可能导致上面提到的 Mark 设计不佳。

        【讨论】:

          猜你喜欢
          • 2018-04-20
          • 1970-01-01
          • 2010-11-07
          • 1970-01-01
          • 1970-01-01
          • 2015-03-18
          • 1970-01-01
          • 1970-01-01
          • 2021-12-26
          相关资源
          最近更新 更多