代码之家  ›  专栏  ›  技术社区  ›  Sorin Antohi

在测试中使用模拟是否值得这样做?

  •  5
  • Sorin Antohi  · 技术社区  · 14 年前

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

    我不得不用模拟来做一些单元测试,为了使它们正常工作,我必须手工创建测试方法所需的对象层次结构(我花了一段时间来编写所需的一切)。

    我想提出的问题是:在生产中使用模拟是否有用?每次有机会我都应该用它吗?而且,为了用模拟测试一种方法而写下所有东西所做的努力,会有回报吗?

    谢谢您

    5 回复  |  直到 14 年前
        1
  •  1
  •   Mark Seemann    14 年前

    是,将模拟对象用作 其中一个 您的许多单元测试工具绝对是一项有价值的工作。

    不过,它最适合 测试驱动开发 因为测试驱动了设计。当你开始 感受痛苦 对于紧密耦合的代码,因为您必须维护深度嵌套的结构,您知道是时候重构为更松散耦合的API了。

        2
  •  1
  •   Russell Giddings    14 年前

    模拟解决以下问题:

    • 没有他们,你的测试就结束了 测试超过您的代码 测试 . 所以如果在 将被标记的依赖项 在你的测试中(甚至更糟的是,它可能 在代码中隐藏一个bug)
    • 集成点可能会返回 你写的时候有不同的结果 测试与由于 外部的 依赖关系更改 (思考-改变 数据库状态)
    • 与集成时 外部系统您的测试将运行很多 更慢的 . 这会导致其他 开发人员较少地运行它们,并且 因此,降低 测验
    • 当正确使用时,它们 测验 易于阅读 意图 你的模块更明显。
        3
  •  0
  •   btlog Stefan Wick MSFT    14 年前

    这是没有权利的。模拟框架(如犀牛模型)可以做一些功能强大的事情。我个人的选择是,我喜欢滚动我自己的模拟对象。如果我觉得这很难,我会把它当作一种气味,认为我的设计出了问题。

    当执行单元测试的设置非常困难或者有很多代码时,我确实会在遗留代码上使用mock。

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

        4
  •  0
  •   Gerrie Schenck    14 年前

    对于我当前的项目,大多数时候我仍然为我的单元测试编写存根对象。只有一次我真的感觉到需要一个模拟对象,我手工写了它。

    我想建议您从实用主义的角度来看待这个问题:如果您需要大量的模拟对象,请考虑学习一个模拟框架(当然这也需要付出一定的代价),否则请使用存根对象或偶尔手写的模拟对象。

        5
  •  0
  •   devlife    14 年前

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

    也就是说,如果你的方法接受了一个iuser,并且需要访问iuser.person.contactinfo.phonenumbers.businessphone,你不需要创建整个图形。您只需执行以下操作:

    var mockuser=new mock(); mockuser.setup(u=>u.person.contactinfo.phonenumbers.businessphone).returns(“555-1212”);

    这可能是有价值的,但也可能导致糟糕的设计如上所述。