phpunit-json-assertions
, (*1)
JSON assertions for PHPUnit includes traits/methods to help validate your JSON data through various methods., (*2)
Features
- Validate your JSON data via JSON Schema
- describes your existing data format
- clear, human- and machine-readable documentation
- complete structural validation, useful for
- automated testing
- validating client-submitted data
- See more details here
- Access JSON data through expressions (e.g.
foo.bar[3]
)
Install
$ composer require estahn/phpunit-json-assertions --dev
or in your composer.json
:, (*3)
{
"require-dev": {
"estahn/phpunit-json-assertions": "@stable"
}
}
Asserts
Assert |
Description |
Available in |
assertJsonMatchesSchema |
Asserts that json content is valid according to the provided schema file |
All |
assertJsonMatchesSchemaString |
Asserts that json content is valid according to the provided schema string |
All |
assertJsonValueEquals |
Asserts if the value retrieved with the expression equals the expected value |
All |
assertJsonValueEquals |
Asserts if the value retrieved with the expression equals the expected value |
All |
assertJsonResponse |
Asserts that a response is successful and of type json |
Symfony |
Usage
You can either use the trait
or class
version., (*4)
Trait
<?php
namespace EnricoStahn\JsonAssert\Tests;
use EnricoStahn\JsonAssert\Assert as JsonAssert;
class MyTestCase extends \PHPUnit_Framework_TestCase
{
use JsonAssert;
public function testJsonDocumentIsValid()
{
// my-schema.json
//
// {
// "type" : "object",
// "properties" : {
// "foo" : {
// "type" : "integer"
// }
// },
// "required" : [ "foo" ]
// }
$json = json_decode('{"foo":1}');
$this->assertJsonMatchesSchema($json, './my-schema.json');
$this->assertJsonValueEquals(1, '* | [0]', $json);
}
}
Class
In case you don't want to use the trait
you can use the provided class wich extends from \PHPUnit_Framework_TestCase
.
You can either extend your test case or use the static methods like below., (*5)
<?php
namespace EnricoStahn\JsonAssert\Tests;
use EnricoStahn\JsonAssert\AssertClass as JsonAssert;
class MyTestCase extends \PHPUnit_Framework_TestCase
{
public function testJsonDocumentIsValid()
{
// my-schema.json
//
// {
// "type" : "object",
// "properties" : {
// "foo" : {
// "type" : "integer"
// }
// },
// "required" : [ "foo" ]
// }
$json = json_decode('{"foo":1}');
JsonAssert::assertJsonMatchesSchema($json, './my-schema.json');
JsonAssert::assertJsonValueEquals(1, '* | [0]', $json);
}
}
Schema storage
The schema storage of justinrainbow/json-schema
allows to register schemas which will effectively override the actual schema location., (*6)
Example:, (*7)
{"$ref" : "https://iglu.foobar.com/myschema.json#/definitions/positiveInteger"}
The resolver will fetch the schema from this endpoint and match the JSON document against it. Using schema storage you're able to override this behaviour., (*8)
$schemastorage->addSchema('https://iglu.foobar.com/myschema.json', (object)['type' => 'string']);
With this in place the resolver will take the schema that is already in place without downloading it again., (*9)
<?php
namespace EnricoStahn\JsonAssert\Tests;
use EnricoStahn\JsonAssert\AssertClass as JsonAssert;
class MyTestCase extends \PHPUnit_Framework_TestCase
{
public function setUp()
{
self::$schemaStorage = new SchemaStorage();
self::$schemaStorage->addSchema('<id>', obj);
...
}
public function testJsonDocumentIsValid()
{
// my-schema.json
//
// {
// "type" : "object",
// "properties" : {
// "foo" : {
// "type" : "integer"
// }
// },
// "required" : [ "foo" ]
// }
$json = json_decode('{"foo":1}');
JsonAssert::assertJsonMatchesSchema($json, './my-schema.json');
JsonAssert::assertJsonValueEquals(1, '* | [0]', $json);
}
}
Extensions
phpunit-json-assertions
provides extensions for simpler handling in different use cases., (*10)
Symfony HttpFoundation Component
The extension EnricoStahn\JsonAssert\Extension\Symfony
allows to pass in the actual response object generated
by the symfony framework and takes care of the decoding part., (*11)
BEFORE:, (*12)
use EnricoStahn\JsonAssert\Assert as JsonAssert;
// ...
$content = $response->getContent();
$json = json_decode($content);
JsonAssert::assertJsonMatchesSchemaString('./my-schema.json', $json);
AFTER:, (*13)
use EnricoStahn\JsonAssert\Extension\Symfony as JsonAssert;
// ...
JsonAssert::assertJsonMatchesSchemaString('./my-schema.json', $response);
Tests
To run the test suite, you need composer., (*14)
$ composer install
$ bin/phpunit
Badge Mania
, (*15)
Alternatives
- https://github.com/martin-helmich/phpunit-json-assert - Doesn't support JSON Schema and uses JSONPath instead of jmespath.php
License
The phpunit-json-assertions library is licensed under the MIT., (*16)
Stargazers over time
, (*17)