Тестирование ответа JSON с помощью Laravel

Я подготовил образец 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
7 926
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

От здесь:

The assertJson method converts the response to an array and utilizes PHPUnit::assertArraySubset to verify that the given array exists within the JSON response returned by the application. So, if there are other properties in the JSON response, this test will still pass as long as the given fragment is present.

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

If you would like to verify that the given array is an exact match for the JSON returned by the application, you should use the assertExactJson method

assertExactJson - это мой путь туда.
Robo Robok 14.09.2018 19:12

Вы знаете, что делает assertJsonFragment?

Robo Robok 19.09.2018 02:18

@RoboRobok assertJson проверяет каждую предоставленную вами пару значений ключа, чтобы увидеть, присутствует ли в ответе в любом месте (на любом уровне вложенности), тогда как assertJsonFragment ищет в вашем ответе точный фрагмент, который вы предоставили. Это видео это хорошо объясняет. Он использует более старый синтаксис seeJson / seeJsonSubset, а не assertJson / assertJsonFragment, но общая информация верна.

Tom 19.09.2018 12:44

Тогда это соглашение об именах не имеет особого смысла. Во всяком случае, должно быть наоборот.

Robo Robok 19.09.2018 14:19

Да, многие соглашаются, и, к сожалению, официальной документации немного не хватает для понимания разницы.

Tom 19.09.2018 15:27

Другие вопросы по теме