【问题标题】:PHP mock data from rest endpoint来自休息端点的 PHP 模拟数据
【发布时间】:2023-03-07 20:38:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php rest mocking phpunit response


    【解决方案1】:

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

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

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

    我会做以下事情:

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

    模拟响应是一件棘手的事情。如果你有一天尝试这样做,当 3rd 方 API 发生变化时,你会遇到麻烦。如果您仍然想走这条路,请查看https://github.com/coduo/tutu

    【讨论】:

    • 一个非常全面的答案谢谢!关于你的第二点。 “引入抽象” 我目前让 Guzzle 向 API 发出请求。 Guzzle 被注入我的包装纸中。这是你的意思的抽象吗?您是否建议,由于这种注入,我可以将 Guzzle(获取真实数据)换成使用假数据响应的 Mock 客户端?
    • 你可以这样做,但我宁愿交换整个“api客户端”(使用guzzle的东西)。你会有一个 Guzzle 实现和一个 Dummy 或 InMemory 实现。很难为我命名抽象,因为我不知道 API 是关于什么的 :)
    • 这正是我所需要的。谢谢 :) 我可能会在 codereview.stackexchange 中发布,以获取有关整个 API 包装器的一些指示。
    • 我不知道那个。谢谢!
    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多