【发布时间】:2011-05-16 09:16:55
【问题描述】:
【问题讨论】:
标签: php unit-testing mocking tdd
【问题讨论】:
标签: php unit-testing mocking tdd
您可能确实开始为 B 编写测试并在您知道需要时立即实施 B,然后回到 A。但是当您回到 A 时,您可能希望为 B 使用模拟,以便您的测试A 确实在测试 A 及其与 B 的交互。
部分原因是 B 可能使用另一个类 C 来完成它的一些工作。如果你想用真实的B来测试A,你还需要C,当然难度可以进一步扩大。
使用 mock,您可以只在 A 调用 B 方法时进行测试,并正确处理您告诉 mock 给出的响应,而不是依赖于 B 的实际实现。
【讨论】:
为了更好地学习如何使用 Mocks 和一般的 TDD,我推荐你 nat pryce 博客和他的书 http://www.natpryce.com/
一般来说,使用过多的模拟不是一个好主意。当您必须隔离应用程序的层(即数据库和视图)或外部(慢)系统时,请使用它们。
编写模拟可能会使您的测试难以阅读,因此最好不要滥用它们。
【讨论】:
模拟对象的想法是 A 的测试不应该依赖于 B 的测试(这就是为什么它被称为“单元”测试 - 你在单独的独立单元中测试代码)。如果 A 使用 B,那么在不依赖于 B 正常工作的情况下,很难测试 A 是否正常工作——除非你用一些知道对“正确”请求给出“正确”响应并检测“错误”的“模拟”对象替换 B要求。这样一来,如果有什么东西让你知道出了问题,那是 A 出了问题,而不是 B 出了问题。 至于开发,有时您可能还不知道 B 是如何实现的——例如,B 是一些您还不知道全部细节的 Web 服务的接口,但您想开始在 A 中开发业务逻辑现在你不关心如何调用 web 服务的登录参数或它接受参数的格式。然后,您可以创建“模拟”B,计算出 A,然后独立添加 B。这也将使 B 支持其他格式等更容易 - 因为您从一开始就以足够通用的方式编写它以抽象出细节。
【讨论】:
模拟对象是一个有趣的想法,但它们与单元测试的概念相冲突。如果 A 类使用 B 类,它实际上是在 A 类和 B 类中集成逻辑。在这种情况下,A 类不是单元测试的候选者,而是集成测试的候选者。正如许多所谓的 TDD 专家所认为的那样,单元测试仅适用于某些类,而不是全部。
【讨论】: