简介
如果您已经阅读了我的内容有一段时间,您可能会知道我喜欢在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。
如果您有兴趣在每次我发布一篇新帖子时都收到更新,请随意在下面注册我的通讯。
继续构建奇妙的事情!🚀
driesvints, teephe 喜欢这篇文章