helmich / phpunit-json-assert
PHPUnit 对 JSON 文档的断言
资助包维护!
martin-helmich
donate.helmich.me
Requires
- php: ^8.0
- justinrainbow/json-schema: ^5.0
- softcreatr/jsonpath: ^0.8
Requires (Dev)
- phpunit/phpunit: ^8.0 || ^9.0 || ^10.0 || ^11.0
Conflicts
- phpunit/phpunit: <8.0 || >= 12.0
This package is auto-updated.
Last update: 2024-08-30 18:13:48 UTC
README
此库向 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'] ] ]);