helmich/phpunit-json-assert

PHPUnit 对 JSON 文档的断言

v3.5.2 2024-05-20 11:18 UTC

README

Unit tests Code Climate Test Coverage Issue Count

此库向 PHPUnit 添加了几个新的断言,允许您使用 JSONPath 表达式和 JSON 模式轻松且简洁地验证复杂的数据结构(通常是 JSON 文档,但不一定是 JSON 文档)。

作者和版权

Martin Helmich [email protected]
此库遵循 MIT 许可协议

安装

$ composer require --dev helmich/phpunit-json-assert

兼容性

此库有多个发行分支,每个分支都与 PHPUnit 和 PHP 的不同版本兼容。以下表格应提供简单的概述

当您使用 composer require 并已在您的 composer.json 文件中声明了对 phpunit/phpunit 的依赖时,Composer 应自动选择最新兼容版本。

使用方法

只需在您的测试用例中使用特质 Helmich\JsonAssert\JsonAssertions。此特质提供了一套新的 assert* 函数,您可以在测试用例中使用它们

<?php
use Helmich\JsonAssert\JsonAssertions;
use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase
{
  use JsonAssertions;

  public function testJsonDocumentIsValid()
  {
    $jsonDocument = [
      'id'          => 1000,
      'username'    => 'mhelmich',
      'given_name'  => 'Martin',
      'family_name' => 'Helmich',
      'age'         => 27,
      'phones' => [
        'mobile' => 111,
        'home'   => 222,
      ],
      'hobbies'     => [
        'Heavy Metal',
        'Science Fiction',
        'Open Source Software',
      ]
    ];

    $this->assertJsonValueEquals($jsonDocument, '$.username', 'mhelmich');
    $this->assertJsonValueEquals($jsonDocument, '$.phones.mobile', 111);
    $this->assertJsonValueEquals($jsonDocument, '$.hobbies.0', 'Heavy Metal');
    $this->assertJsonValueEquals($jsonDocument, '$.hobbies[*]', 'Open Source Software');
  }
}

大多数断言都接受一个 $jsonPath 参数,该参数可以包含由 JSONPath 库支持的任何类型的表达式。

或者,您可以通过将文件 src/Functions.php 包含到您的测试用例中来使用功能接口

<?php
use Helmich\JsonAssert\JsonAssertions;
use PHPUnit\Framework\TestCase;

require_once('path/to/Functions.php');

class MyTestCase extends TestCase
{
  use JsonAssertions;

  public function testJsonDocumentIsValid()
  {
    $jsonDocument = [
      'id'          => 1000,
      'username'    => 'mhelmich',
      'given_name'  => 'Martin',
      'family_name' => 'Helmich',
      'age'         => 27,
      'hobbies'     => [
        "Heavy Metal",
        "Science Fiction",
        "Open Source Software"
      ]
    ];

    assertThat($jsonDocument, containsJsonValue('$.username', 'mhelmich'));
    assertThat($jsonDocument, matchesJsonConstraints([
        '$.given_name' => 'Martin',
        '$.age'        => greaterThanOrEqual(18),
        '$.hobbies'    => callback(function($a) { return count($a) > 2; })
    ]));
  }
}

断言参考

assertJsonValueEquals($doc, $jsonPath, $expected)

断言在 $doc 中通过 JSON 路径 $jsonPath 找到的 JSON 值等于 $expected

assertJsonValueMatches($doc, $jsonPath, PHPUnit_Framework_Constraint $constraint)

断言在 $doc 中通过 JSON 路径 $jsonPath 找到的 JSON 值匹配约束 $constraint

示例

$this->assertJsonValueMatches(
  $jsonDocument,
  '$.age',
  PHPUnit_Framework_Assert::greaterThanOrEqual(18)
);
assertJsonDocumentMatches($doc, $constraints)

断言变量数量的 JSON 值匹配约束。$constraints 是一个键值数组,其中 JSON 路径表达式用作约束值的键。

示例

$this->assertJsonDocumentMatches($jsonDocument, [
    '$.username' => 'mhelmich',
    '$.age'      => PHPUnit_Framework_Assert::greaterThanOrEqual(18)
]);
assertJsonDocumentMatchesSchema($doc, $schema)

断言给定的 JSON 文档与特定的 JSON 模式 匹配。

示例

$this->assertJsonDocumentMatchesSchema($jsonDocument, [
    'type'       => 'object',
    'required'   => ['username', 'age'],
    'properties' => [
        'username' => ['type' => 'string', 'minLength' => 3],
        'age'      => ['type' => 'number']
    ]
]);