【问题标题】:Unit Testing: Explain the usefulness of Mock Objects [duplicate]单元测试:解释模拟对象的有用性
【发布时间】:2011-05-16 09:16:55
【问题描述】:

【问题讨论】:

标签: php unit-testing mocking tdd


【解决方案1】:

您可能确实开始为 B 编写测试并在您知道需要时立即实施 B,然后回到 A。但是当您回到 A 时,您可能希望为 B 使用模拟,以便您的测试A 确实在测试 A 及其与 B 的交互。

部分原因是 B 可能使用另一个类 C 来完成它的一些工作。如果你想用真实的B来测试A,你还需要C,当然难度可以进一步扩大。

使用 mock,您可以只在 A 调用 B 方法时进行测试,并正确处理您告诉 mock 给出的响应,而不是依赖于 B 的实际实现。

【讨论】:

    【解决方案2】:

    为了更好地学习如何使用 Mocks 和一般的 TDD,我推荐你 nat pryce 博客和他的书 http://www.natpryce.com/

    一般来说,使用过多的模拟不是一个好主意。当您必须隔离应用程序的层(即数据库和视图)或外部(慢)系统时,请使用它们。

    编写模拟可能会使您的测试难以阅读,因此最好不要滥用它们。

    【讨论】:

      【解决方案3】:

      模拟对象的想法是 A 的测试不应该依赖于 B 的测试(这就是为什么它被称为“单元”测试 - 你在单独的独立单元中测试代码)。如果 A 使用 B,那么在不依赖于 B 正常工作的情况下,很难测试 A 是否正常工作——除非你用一些知道对“正确”请求给出“正确”响应并检测“错误”的“模拟”对象替换 B要求。这样一来,如果有什么东西让你知道出了问题,那是 A 出了问题,而不是 B 出了问题。 至于开发,有时您可能还不知道 B 是如何实现的——例如,B 是一些您还不知道全部细节的 Web 服务的接口,但您想开始在 A 中开发业务逻辑现在你不关心如何调用 web 服务的登录参数或它接受参数的格式。然后,您可以创建“模拟”B,计算出 A,然后独立添加 B。这也将使 B 支持其他格式等更容易 - 因为您从一开始就以足够通用的方式编写它以抽象出细节。

      【讨论】:

      • 很好的解释。谢谢。
      【解决方案4】:

      模拟对象是一个有趣的想法,但它们与单元测试的概念相冲突。如果 A 类使用 B 类,它实际上是在 A 类和 B 类中集成逻辑。在这种情况下,A 类不是单元测试的候选者,而是集成测试的候选者。正如许多所谓的 TDD 专家所认为的那样,单元测试仅适用于某些类,而不是全部。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多