来自rest端点的PHP模拟数据

来自rest端点的PHP模拟数据,php,rest,mocking,phpunit,response,Php,Rest,Mocking,Phpunit,Response,我正在围绕第三方API编写一个PHP包装器。更多的是为了练习,但我也没有看到一个好的,现在任何地方都可以,所以也许它会被其他人在未来使用 我的单元测试非常简单,只是现在达到了极限 API的开发人员有一个最大请求限制(每秒1个,每分钟20个),我的单元测试通过API包装器访问API端点,因此测试我的包装器。但是运行phpunit开始返回429过多请求错误。显然,Phpunit正在运行我所做的15个左右的测试,所有这些测试访问端点的速度都过快,给了我这个错误 有人知道我是否应该嘲笑这些回答吗?如果我

我正在围绕第三方API编写一个PHP包装器。更多的是为了练习,但我也没有看到一个好的,现在任何地方都可以,所以也许它会被其他人在未来使用

我的单元测试非常简单,只是现在达到了极限

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

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


我是单元测试新手,我现在对这个想法感到非常不舒服,但是我开始对它感到温暖了

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

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

  • 单元测试——孤立地测试一个“单元”,通常是一个类。大多数情况下,它是通过模拟或存根单元的依赖项来实现的。此级别不应使用任何基础结构(网络、文件系统等)
  • 集成测试-测试组件之间如何交互。你可能会碰到基础设施,但你仍然可以选择不(优化)
我会做以下几件事:

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

嘲笑回应是一件棘手的事情。如果有一天你尝试这样做,当第三方API改变时,你会遇到麻烦。如果您仍然想走这条路,请查看。

一个非常全面的答案,谢谢!关于你的第二点。“引入一个抽象”我目前有Guzzle向API发出请求。口香糖被注射到我的包装袋里。这就是你所说的抽象吗?您是否建议,由于这种注入,我可以将Guzzle(获取真实数据)替换为使用虚假数据响应的模拟客户端?您可以这样做,但我宁愿替换整个“api客户端”(使用Guzzle的东西)。您将有一个Guzzle实现和一个虚拟或内存实现。很难为我命名抽象,因为我不知道API是关于什么的:)这正是我需要的。谢谢:)我可能会在codereview.stackexchange中发布一些关于整个API包装器的指针。我不知道那个。谢谢