支持Laravel.io的持续发展 →

Lawman:Saloon API集成之害虫架构测试

3 Jul, 2024 5 min read

简介

如果您已经阅读了我的内容有一段时间,您可能会知道我喜欢在Laravel中构建和测试API集成。它们都是两项非常有趣的任务,如果您做对了,它们会很有成就感。

使用Saloon在我的Laravel项目中构建API集成使得这一切变得更加有趣!这是一个非常强大的工具,它使得在Laravel中构建和测试API集成变得很容易。事实上,我书中的很大一部分,《在Laravel中消费API》,都是专门介绍如何使用Saloon来构建和测试API集成。

得益于一个名为“Lawman”的酷炫包,由Jon Purvis创建,我们可以将测试推进得更远,向我们的Saloon集成代码添加一些非常强大的Pest架构测试。

在这篇文章中,我们将查看一些示例,展示您如何在PHP和Laravel项目中使用Lawman。

如果您还不熟悉架构测试以及它达到的效果,您可能想查看我的《在Laravel中使用Pest进行架构测试》文章,其中对其进行了更详细的解释。

安装

要开始使用Lawman,您首先需要安装它。您可以通过在项目根目录中运行以下命令,使用Composer来完成此操作。

composer require jonpurvis/lawman --dev

请注意,我们在这里使用了--dev标志,以确保Lawman仅在您的开发环境中安装。这是因为Lawman是一个测试工具,您不想将其包含在您的生产环境中。

用法示例

现在您已经安装了Lawman,您可以开始使用它来测试您的Saloon集成。

要了解它提供的架构测试期望,让我们看看一些示例。

让我们假设我们在一个Laravel应用程序中使用Saloon构建了一个简单的GitHub API集成。我们可能会有以下包含我们的集成代码的文件

连接器

  • app/Http/Integrations/GitHub/GitHubConnector.php

请求

  • app/Http/Integrations/GitHub/Requests/CreateRepoRequest.php
  • app/Http/Integrations/GitHub/Requests/GetReposRequest.php

让我们看看我们可以为我们的app/Http/Integrations/GitHub/GitHubConnector.php文件使用Lawman期望编写的测试。

use App\Http\Integrations\GitHub\GitHubConnector;

test('connectors')
    ->expect(GitHubConnector::class)
    ->toBeSaloonConnector()
    ->toUseAcceptsJsonTrait()
    ->toUseAlwaysThrowOnErrorsTrait()
    ->toBeTriedAgainOnFailure()
    ->toHaveRetryInterval()
    ->toUseExponentialBackoff()
    ->toHaveRateLimits();

在上述架构测试中,我们正在断言我们的App\Http\Integrations\GitHub\GitHubConnector符合几个标准

  • 它扩展了Saloon\Http\Connector类。
  • 它使用了Saloon\Traits\Plugins\AcceptsJson特征。
  • 它使用了Saloon\Traits\Plugins\AlwaysThrowOnErrors特征。
  • 它有一个大于1的tries属性(用于在失败时重试请求)。
  • 它有一个retryInterval属性(用于指定重试之间的等待时间)。
  • 它有一个useExponentialBackoff属性(用于指定是否对请求重试使用指数退避)。
  • 它使用了Saloon\RateLimitPlugin\Traits\HasRateLimits插件。

如果上述任何标准未达标,测试将失败。

您还可能想编写一个测试来确保App\Http\Integrations\GitHub\Requests目录内的所有PHP文件都是Saloon请求类

test('requests')
    ->expect('App\Http\Integrations\GitHub\Requests')
    ->toBeSaloonRequest();

关于Lawman的酷之处在于,您不仅可以使用Lawman的期望,还可以使用Pest的默认期望。例如,我们可以使用一些Pest的默认期望来更新上述测试

test('requests')
    ->expect('App\Http\Integrations\GitHub\Requests')
    ->toBeSaloonRequest()
    ->toHaveSuffix('Request')
    ->toUseStrictTypes()
    ->toBeFinal();

在上述测试中,我们正在断言App\Http\Integrations\GitHub\Requests命名空间内的所有PHP文件符合以下标准

  • 必须是Saloon请求类
  • 类名必须以"Request"结尾
  • 这些文件使用了严格的类型声明
  • 这些文件被标记为final

Lawman还允许您确保在命名空间中给出的文件使用了正确的HTTP方法。例如,您可能想断定一个请求类发送了一个GET请求,并且启用了缓存

use App\Http\Integrations\GitHub\Requests\GetReposRequest;

test('get requests')
    ->expect(GetReposRequest::class)
    ->toSendGetRequest()
    ->toHaveCaching();

另一个例子可能是断定一个请求类发送了一个POST请求,并且有一个JSON主体。

use App\Http\Integrations\GitHub\Requests\CreateRepoRequest;

test('post requests')
    ->expect(CreateRepoRequest::class)
    ->toSendPostRequest()
    ->toHaveJsonBody();

可用的期望

我们无法覆盖Lawman提供的所有期望(这篇文章会变得很大!)。但以下是您可用的其他期望列表

身份验证

  • toUseTokenAuthentication
  • toUseBasicAuthentication
  • toUseCertificateAuthentication
  • toUseHeaderAuthentication

缓存

  • toHaveCaching

连接器

  • toBeSaloonConnector

分页

  • toUsePagedPagination
  • toUseOffsetPagination
  • toUseCursorPagination
  • toUseCustomPagination

属性

  • toSetConnectTimeout
  • toSetRequestTimeout
  • toBeTriedAgainOnFailure
  • toHaveRetryInterval
  • toUseExponentialBackoff
  • toThrowOnMaxTries

速率限制

  • toHaveRateLimits

请求

  • toBeSaloonRequest
  • havingRequestMethod
  • toSendGetRequest
  • toSendPostRequest
  • toSendHeadRequest
  • toSendPutRequest
  • toSendPatchRequest
  • toSendDeleteRequest
  • toSendOptionsRequest
  • toSendConnectRequest
  • toSendTraceRequest
  • toHaveJsonBody
  • toHaveMultipartBody
  • toHaveXmlBody
  • toHaveFormBody
  • toHaveStringBody
  • toHaveStreamBody

响应

  • toBeSaloonResponse

特征

  • toUseAcceptsJsonTrait
  • toUseAlwaysThrowOnErrorsTrait
  • toUseTimeoutTrait
  • toUseAuthorisationCodeGrantTrait
  • toUseClientCredentialsGrantTrait

结论

希望这篇文章能让您对如何使用Lawman为Saloon集成代码添加一些强大的害虫架构测试有更深的了解。

如果您喜欢阅读这篇帖子,您可能对阅读我的440多页电子书感兴趣,“在Laravel中使用API”,该书教授您如何使用Laravel从其他服务中消费API。

如果您有兴趣在每次我发布一篇新帖子时都收到更新,请随意在下面注册我的通讯。

继续构建奇妙的事情!🚀

上次更新4周前。

driesvints, teephe 喜欢这篇文章

2
喜欢这篇文章? 让作者知道并给他们鼓掌!
ash-jc-allen (Ash Allen) 我是一名来自英国普雷斯顿的自由职业Laravel web开发者。我维护Ash Allen Design博客,并参与了很多酷炫和令人兴奋的项目 🚀

你可能还喜欢以下文章

2024年3月11日

如何使用Larastan将您的Laravel应用程序从0到9升级

在您的Laravel应用程序执行之前发现错误是可能的,多亏了Larastan,这是一种...

阅读文章
2024年7月19日

无需特性规范API响应

我发现,大多数用于API响应的库都是使用特性实现的,并且...

阅读文章
2024年7月17日

通过Discord通知收集您的Laravel项目的反馈

如何创建Laravel项目中的反馈模块,并在收到消息时收到Discord通知...

阅读文章

我们感谢以下这些 极棒的公司 对我们的支持

您的标志在这里?

Laravel.io

The Laravel portal for problem solving, knowledge sharing and community building.

Laravel.io

社交媒体

社区

© 2024 Laravel.io - 版权所有。