helmich/phpunit-psr7-assert

PHPUnit assertions for testing PSR7-compliant applications

v4.4.1 2023-07-26 19:04 UTC

README

Unit tests Code Climate Test Coverage

此库为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参数

  1. 如果没有提供约束,则当标题存在且不为空时,断言将匹配。

  2. 如果提供了原始值作为$constraint,则当标题存在且等于指定的值时,断言将匹配。

  3. 如果$constraintPHPUnit\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 是原始值,当消息体等于约束时,断言将通过。如果 $constraintPHPUnit\Framework\Constraint\Constraint 类的实例,约束将被评估。

assertMessageBodyMatchesJson($message, $jsonConstraints) / bodyMatchesJson($jsonConstraints)

这实际上断言了几个事实

  1. 消息必须有一个等于 application/jsoncontent-type 头部
  2. 消息体必须是一个有效的 JSON 字符串(这意味着可以被 json_decode 解码)
  3. 编码的 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 到 299
  • assertResponseIsRedirect($response) / isRedirect() -- 状态码 300 到 399
  • assertResponseIsClientError($response) / isClientError() -- 状态码 400 到 499
  • assertResponseIsServerError($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 接口的实例