来自 REST 端点的 PHP 模拟数据

2024-01-10

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

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

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

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

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


非常好的问题!当您刚开始测试时,这是一个常见问题。

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

  • 单元测试 - 单独测试一个“单元”,通常是一个类。大多数时候它是通过模拟或存根单元的依赖关系来实现的。此级别不应使用任何基础设施(网络、文件系统等)。
  • 集成测试 - 测试组件如何相互交互。您可能会影响基础设施,但您仍然可以选择不这样做(以进行优化)。

我会做以下事情:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 REST 端点的 PHP 模拟数据 的相关文章

随机推荐

  • Process.Start() 抛出“访问被拒绝”错误

    当我执行一个进程并尝试重定向输出 错误时 出现以下错误 System ComponentModel Win32Exception 0x80004005 Access is denied at System Diagnostics Proce
  • 如何在从jquery动态添加的html中渲染vuejs组件

    我在 html 中有一个从 jquery ajax 调用返回的 vuejs 组件 但它不渲染该组件 那么如何让vuejs从jquery渲染这个组件呢 jquery 代码示例 post baseURL media postData funct
  • 如何在 React 15 中创建默认为空的受控输入

    我想要控制文本输入 但它需要支持空值 这是我的组件 import React Component PropTypes from react import ControlLabel FormControl FormGroup from rea
  • 处理来自多个 AJAX JQuery 查询的独立数据

    我有许多从 for 循环发送的 AJAX 请求 并且希望根据循环中的位置将一些数据发送到回调函数 当我尝试将一个函数附加到每个请求时 它们似乎都从上次调用中获取数据 例如 for var i 0 i lt 4 i data some uni
  • 为什么 C# 中字典优于 Hashtable?

    在大多数编程语言中 字典优于哈希表 这背后的原因是什么 就其价值而言 一本字典is 概念上 哈希表 如果您的意思是 我们为什么要使用Dictionary
  • Kinect SDK 2 与 Xbox 360 Kinect 兼容吗?

    我正在尝试使用 Xbox 360 的 Kinect 开发一个有趣的人脸识别应用程序 我想知道应该使用哪个 SDK 和 Visual Studio 版本才能最好地访问 Kinect Kinect SDK 2 与 Xbox 360 Kinect
  • BoostBuild:patchlevel.h 不存在

    我正在尝试在 Ubuntu 11 04 上使用 bjam 编译 C 项目 我不断收到以下错误 libraries boost 1 44 0 boost python detail wrap python hpp 75 24 fatal er
  • 调试 pthread 需要什么?

    我想在我的自定义 Linux 发行版上调试 pthreads 但我缺少一些东西 我的主机是 Ubuntu 12 04 我的目标是使用 crosstool NG 交叉编译器工具集构建的 i486 定制嵌入式 Linux 操作系统的其余部分是使
  • 在待完成的活动消失后,找出当前活动最终是否将成为任务根

    If FirstActivity是任务的根 它会自行完成并启动SecondActivity 然后调用isTaskRoot in SecondActivity立即返回false 因为FirstActivity的完成是异步发生的 因此尚未完成
  • 给定日期,获取星期几 - SYSTEMTIME

    如果提供了日期 月 日 年 是否可以使用 SYSTEMTIME 确定星期几 或者该结构只是单向的 如果 SYSTEMTIME 无法做到这一点 使用 Win32 完成我所要求的任务的最轻量级方法是什么 根据msdn http msdn mic
  • 如何在 iOS 设备 ( Safari ) 中消除或限制滚动事件

    我正在尝试为移动和桌面设备实现无限滚动下拉菜单 在 无限滚动 下 我的意思是 如果您有 100 条记录 当到达可滚动容器的末尾时 将加载 20 条新记录 并且前 20 条记录将隐藏 向后方向相同 我遇到了以下问题 除了 Safari 移动浏
  • 必须先发出 STARTTLS 命令

    我正在用我的运行这个简单的例子Gmail帐户 但它无法正常工作并给出以下错误 send failed exception com sun mail smtp SMTPSendFailedException 530 5 7 0 Must is
  • std::common_type 的目的是什么?

    我开始看std common type我不太确定其目的和功能 有几件事仍然让我觉得奇怪 参数的顺序很重要 common type
  • 访问 Pod 中的资源

    我想将图像资源包含在 cocoapod 库中 但访问它们时遇到问题 我已阅读这些资源来寻求帮助 Cocoapods 资源 http guides cocoapods org syntax podspec html resources Coc
  • Rust 中的 Some 和 Option 有什么区别?

    它们是一样的吗 我有时可以看到文档使用它们 就好像它们是相等的一样 不 它们不一样 并且文档将它们视为相同是错误的 或者是您的误解 Option是一种类型 更准确地说 是泛型类型构造函数 Option
  • 返回具有多种类型迭代器的 impl Iterator [重复]

    这个问题在这里已经有答案了 我试图将我的问题提炼成一个最小的例子 在下面的函数中 如果我只有 if 语句的任一分支 则程序可以正常编译 fn foo bar bool gt impl Iterator
  • 如何从自定义主键迁移到默认ID [重复]

    这个问题在这里已经有答案了 我创建了一个以电子邮件地址作为自定义主键的模型 如下所示 email models EmailField max length 255 primary key True 现在我意识到这对我来说不是一个好主意 我想
  • 取消 UIView animateWithDuration 中的块

    void startLoading self blink void blink UIView animateWithDuration 0 5 delay 0 0 options UIViewAnimationOptionAllowUserI
  • 为什么我必须将 Vinyl-source-stream 与 gulp 一起使用?

    我正在尝试使用 gulp 和 browserify 来改变我的 jsx文件到 js files var gulp require gulp var browserify require browserify var reactify req
  • 来自 REST 端点的 PHP 模拟数据

    我正在围绕第三方 API 编写 PHP 包装器 对于练习来说更是如此 但我目前还没有在任何地方看到一个好的可用的 所以也许将来它会被其他人使用 我的单元测试非常简单 但现在我已经达到了极限 API 的开发人员有最大请求限制 每秒 1 个 每