Ларавель тест. утверждать точную структуру JSON

У меня есть проект API laravel. Существует много данных безопасности, которые не должны отображаться для пользователей в ответах API. Мне нужен какой-то способ написать тесты, где я могу получить true, если только структура ответа точно такая же, как предварительно заданная структура в тесте.

Итак, если моя тестовая структура $structure = [ 'data' => ['_id', 'user' => ['name', 'email], 'title'];, но в ответ я получаю больше или меньше полей, мне нужно, чтобы этот тест провалился.

В документах я нашел только:

assertJson - ожидание точного ключа => значения, но мне нужны только ключи; assertJsonStructure - возвращает true, даже если некоторые поля отсутствуют или ответ содержит некоторые другие поля.


person Denys Siebov    schedule 03.10.2019    source источник
comment
вы можете сделать пользовательскую функцию для этого   -  person N69S    schedule 03.10.2019
comment
@ N69S уверен, что смогу. Но я сначала ищу что-то существующее.   -  person Denys Siebov    schedule 03.10.2019
comment
Вы хотите протестировать только структуру или также и данные? Если вы хотите проверить данные, вы можете использовать $this->assertEquals(..., ...), если вы хотите быть уверены, что некоторые значения не отображаются, вы можете использовать $this->assertArrayNotHasKey();   -  person Mauro Baptista    schedule 03.10.2019


Ответы (1)


Используйте схему Opis JSON

$validator = new \Opis\JsonSchema\Validator();
$result = $validator->dataValidation($json, $schema);
PHPUnit::assertTrue($result->isValid(), "Mismatch json schema");

В вашем случае узнайте больше о required и additionalProperties: https://docs.opis.io/json-schema/1.x/object.html#required

Ваша схема json может выглядеть так:

{
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer"
        }
      }
}
person Serhii Posternak    schedule 03.10.2019
comment
Выглядит неплохо. Могу ли я потребовать встроенные конструкции? Например, `[ require: ['_id', 'title', 'user', 'user.name', 'user.age'] `. - person Denys Siebov; 07.10.2019
comment
Да. Я обновил свой ответ и добавил к нему пример схемы json. - person Serhii Posternak; 07.10.2019