Тестирование ответа JSON с помощью Laravel - PullRequest
0 голосов
/ 14 сентября 2018

Я подготовил пример API с помощью Laravel. Всегда возвращает этот объект:

{
    "a": 1,
    "b": 2
}

Теперь я хотел бы лучше понять, как протестировать его с phpunit. Я обнаружил, что есть методы assertJson и assertJsonFragment, и я не понимаю разницу между ними.

Скажем, я бы хотел утверждать точную структуру ответа, поэтому он должен быть a=1 и b=2, ни больше, ни меньше. Сначала я был уверен, что это сработает:

$response = $this->get('/api/foo');

$response->assertStatus(200)
         ->assertJson(['a' => 1, 'b' => 2]);

Он пройдет тест, но проблема в том, что он все равно пройдет тест, если я добавлю в ответ дополнительные свойства, например c=3 или что-то еще. Затем существует метод assertJsonFragment, который для моих тестов ведет себя одинаково, просто выдает разные сообщения об ошибках.

Не глючит ли assertJson? Есть ли другой способ сделать то, что я пытаюсь сделать, это просто убедиться, что ответом является именно этот набор свойств?

Проверено на Laravel 5.6 и 5.7.

1 Ответ

0 голосов
/ 14 сентября 2018

С здесь :

Метод assertJson преобразует ответ в массив и использует PHPUnit::assertArraySubset чтобы убедиться, что данный массив существует в ответе JSON, возвращаемом приложением. Итак, если есть другие свойства в ответе JSON, этот тест будет по-прежнему проходить как Пока данный фрагмент присутствует.

И что еще более важно, чтобы достичь того, что вы хотите:

Если вы хотите убедиться, что данный массив является точным соответствием для JSON, возвращенного приложением, вам следует использовать метод assertExactJson

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...