PHP 来自休息端点的模拟数据

PHP mock data from rest endpoint

我正在围绕第三方 API 编写 PHP 包装器。对于练习来说更是如此,但我目前也没有看到任何可用的好方法,所以也许将来其他人会使用它。

我的单元测试一直很简单,除了现在我已经达到了极限。

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

有人知道我 a) 是否应该模拟这些响应,以及 b) 如果我正在测试我的包装器,我将如何模拟这些响应? 。如果测试不在我的实际包装器对象上 运行 并且我肯定不想让我的包装器使用模拟响应,那么测试有什么用?

我是单元测试的新手,目前我对这个想法感到很不舒服,但是我开始喜欢它了!

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

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

  • 单元测试 - 单独测试 "unit",通常是 class。大多数情况下,它是通过模拟或存根单元的依赖项来实现的。不应在此级别使用任何基础设施(网络、文件系统等)。
  • 集成测试 - 测试组件如何相互交互。你可能会触及基础设施,但你仍然可以选择不去(优化)。

我会执行以下操作:

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

嘲笑回应是一件棘手的事情。如果有一天你尝试这样做,当第 3 方 API 发生变化时,你会 运行 陷入麻烦。如果你还想走这条路,看看https://github.com/coduo/tutu