helmich / phpunit-psr7-assert
PHPUnit assertions for testing PSR7-compliant applications
支持包维护!
martin-helmich
donate.helmich.me
Requires
- php: ^8.0
- helmich/phpunit-json-assert: ^3.4
- psr/http-message: ^1.1 || ^2.0
Requires (Dev)
- guzzlehttp/psr7: ^2.4
- mockery/mockery: ^1.4.1
- phpunit/phpunit: ^8.0 || ^9.0 || ^10.0
Conflicts
- phpunit/phpunit: <8.0 || >= 11.0
README
此库为PHPUnit添加了几个新的断言,允许您轻松简洁地测试实现PSR-7接口的HTTP请求和响应消息。
作者和版权
Martin Helmich [email protected] 此库采用MIT许可证。
安装
$ composer require helmich/phpunit-psr7-assert
兼容性
此库有多个发布分支,每个分支都与PHPUnit和PHP的不同版本兼容。以下表格应提供一个简单的概览
当您使用composer require
并在您的composer.json
文件中已经声明了对phpunit/phpunit
的依赖关系时,Composer应自动选择最新的兼容版本。
用法
使用Psr7Assertions
特质
只需在任何测试用例中使用特质Helmich\Psr7Assert\Psr7Assertions
。此特质提供了一组新的assert*
函数,您可以在测试用例中使用这些函数
<?php use Helmich\Psr7Assert\Psr7Assertions; use PHPUnit\Framework\Testcase; class MyTestCase extends Testcase { use Psr7Assertions; public function testRequestMatchesExpectations() { $request = /* build some instance of Psr\Http\Message\MessageInterface */; $this->assertRequestHasUri($request, '/foo'); $this->assertRequestIsPost($request); $this->assertMessageHasHeaders($request, [ 'content-type' => 'application/json', 'expect' => '202-accepted' ]); $this->assertMessageBodyMatchesJson($request, [ '$.username' => 'mhelmich' ]); } }
大多数断言都接受一个$message
参数,该参数预期为Psr\Http\Message\MessageInterface
类的实例 -- 这意味着许多断言既可以与请求消息也可以与响应消息一起工作。这些接口由psr/http-message
包定义。
使用函数式接口
此包还提供了一种函数式接口,它可以比Psr7Assertions
特质提供的断言以更流畅的方式使用。只需将文件src/Functions.php
包含到您的测试用例中即可(最好使用Composer的autoload-dev
设置)
public function testRequestMatchesExpectations() { $request = /* build some instance of Psr\Http\Message\MessageInterface */; assertThat($request, logicalAnd( hasUri('/foo'), isPost(), hasHeaders([ 'content-type' => 'application/json', 'expect' => '202-accepted' ]), bodyMatchesJson(['$.username' => 'mhelmich']) )); }
断言参考
assertRequestHasUri($request, $uri)
/ hasUri($uri)
断言请求$request
的请求URI等于$uri
$this->assertRequestHasUri($request, '/foo')); assertThat($request, hasUri('/foo'));
assertMessageHasHeader($message, $header[, $constraint])
/ hasHeader($name[, $constraint])
断言名为$header
的标题存在于HTTP消息中。此断言的确切行为取决于$constraint
参数
-
如果没有提供约束,则当标题存在且不为空时,断言将匹配。
-
如果提供了原始值作为
$constraint
,则当标题存在且等于指定的值时,断言将匹配。 -
如果
$constraint
是PHPUnit\Framework\Constraint\Constraint
类的实例,则当约束评估为TRUE
时,断言将匹配。示例
assertThat($request, hasHeader('content-length', greaterThan(1000)));
assertMessageHasHeaders($message, $constraints)
/ hasHeaders($constraints)
与assertMessageHasHeader
相同,只是有多个标题。$constraints
是一个键值数组,使用标题名称作为键,约束(见上文)作为值。
示例
assertThat($request, hasHeaders([ 'content-type' => 'application/json', 'content-length' => greaterThan(1000) ]));
assertMessageBodyMatches($message, $constraint)
/ bodyMatches($constraint)
断言消息体与约束 $constraint
匹配。如果 $constraint
是原始值,当消息体等于约束时,断言将通过。如果 $constraint
是 PHPUnit\Framework\Constraint\Constraint
类的实例,约束将被评估。
assertMessageBodyMatchesJson($message, $jsonConstraints)
/ bodyMatchesJson($jsonConstraints)
这实际上断言了几个事实
- 消息必须有一个等于
application/json
的content-type
头部 - 消息体必须是一个有效的 JSON 字符串(这意味着可以被
json_decode
解码) - 编码的 JSON 对象必须匹配在
$jsonConstraints
数组中指定的所有约束。为此,将使用 helmich/phpunit-json-assert 包。
assertMessageBodyMatchesForm($message, $formConstraints)
/ bodyMatchesForm($formConstraints)
这断言消息体包含 application/x-www-form-urlencoded
编码的内容,各个变量与 $formConstraints
数组匹配。
assertRequestHasMethod($request, $method)
/ hasMethod($method)
断言请求具有 $method
方法。对于最常见的请求方法,有一些简写断言可用
assertRequestIsGet($request)
/isGet()
assertRequestIsPost($request)
/isPost()
assertRequestIsPut($request)
/isPut()
assertRequestIsDelete($request)
/isDelete()
assertResponseHasStatus($response, $status)
/ hasStatus($status)
断言响应状态与给定的约束匹配。如果 $status
是一个标量值,此断言将检查相等性。
assertThat($response, hasStatus(200)); assertThat($response, hasStatus(logicalAnd(greaterThanOrEqual(200), lessThan(400))));
对于最常见的检查,有一些简写断言可用
assertResponseIsSuccess($response)
/isSuccess()
-- 状态码 200 到 299assertResponseIsRedirect($response)
/isRedirect()
-- 状态码 300 到 399assertResponseIsClientError($response)
/isClientError()
-- 状态码 400 到 499assertResponseIsServerError($response)
/isServerError()
-- 状态码 500 到 599
assertStringIsAbsoluteUri($uri)
/ isAbsoluteUri()
断言字符串 $uri
包含一个有效的绝对 URL(需要方案和主机名)。
assertHasQueryParameter($uriOrRequest, $name[, $value])
/ hasQueryParameter($name[, $value])
断言 URI 包含一个与给定约束匹配的查询参数。 $name
和 $value
可以是字符串值,也可以是 PHPUnit\Framework\Constraint\Constraint
接口的实例。
$uriOrRequest
的值可以是
- 一个字符串,将被解释为 URI
Psr\Http\Message\UriInterface
接口的实例Psr\Http\Message\RequestInterface
接口的实例