来自其他端点的

时间:2016-03-28 18:08:27

标签: php rest mocking phpunit response

我正在围绕第三方API编写PHP包装器。对于练习来说更是如此,但我现在也看不到任何好的,所以未来可能会被其他人使用。

我的单元测试非常简单,但现在我已达到极限。

API的开发人员有一个最大请求限制(每秒1次,每分钟20次),我的单元测试通过我的API包装器访问API端点,因此测试我的包装器。但是,运行phpunit已开始返回429 too many requests错误。因此,Phpunit显然正在运行我所拥有的15个左右的测试,所有测试都过快地访问端点并给我这个错误。

有人知道我 a)是否应该嘲笑这些回复,而 b)如果我正在测试我的包装器,我将如何模拟回复?。如果他们没有在我的实际包装器对象上运行,那么测试有什么用呢?我肯定不想让我的包装器使用模拟响应?

我是单位测试的新手,我觉得此刻的想法非常不舒服,但是我开始热衷于它!

1 个答案:

答案 0 :(得分:4)

非常好的问题!当您不熟悉测试时,这是一个常见问题。

首先,区分单元测试和集成测试:

  • 单元测试 - 单独测试一个"单元",通常是一个类。它通过在大多数时间嘲弄或扼杀单位的依赖来实现。在这个级别不应该使用任何基础设施(网络,文件系统等)。
  • 集成测试 - 测试组件如何相互交互。您可能会遇到基础设施,但您仍然可以选择不(优化)。

我要做以下事情:

  • 将API客户端实现为库并为其编写集成测试。这些集成测试实际上将触及API,并将证明客户端按预期与API交互。我会在API客户端更改时运行它们,或定期运行它们以确保我仍然与API兼容。这些测试不会像应用程序测试那样经常运行,因为它们是独立测试套件的一部分。
  • 在应用程序中引入一个抽象,让我可以为与API交互的任何内容提供替代实现。这样我就可以用更简单的实现(例如内存中的一个)编写接受或其他类型的集成测试。
  • 如果我在应用程序中假设API客户端如何工作,请确保我已经进行了集成测试,证明此假设是正确的。例如,如果我调用具有有效ID的方法,则返回一个对象。否则会引发异常。只有在我验证它们的某个地方进行集成测试时,我才能依赖这些规则。

模拟回复是一项棘手的事情。如果你有一天尝试这样做,当第三方API发生变化时,你会遇到麻烦。如果您仍想继续这条路,请查看https://github.com/coduo/tutu