Тестирование Laravel, получить контент JSON

В Laravel unit test я могу проверить API JSON следующим образом:

$this->post('/user', ['name' => 'Sally'])
    ->seeJson([
        'created' => true,
    ]);

Но что, если я хочу использовать ответ. Как я могу получить ответ JSON (как массив) с помощью $this->post()?

Ответы

Ответ 1

В настоящее время в 5.3 это работает...

$content = $this->get('/v1/users/1')->response->getContent();

Он разрушает цепочку, однако, поскольку response возвращает ответ, а не тестовый бегун. Таким образом, вы должны сделать свои привязанные утверждения до получения ответа, например...

$content = $this->get('/v1/users/1')->seeStatusCode(200)->response->getContent();

Ответ 2

Правильный способ получить контент:

$content = $this->get('/v1/users/1')->decodeResponseJson();

Ответ 3

Мне нравится использовать json-метод при работе с json, а не → get()

$data = $this->json('GET', $url)->seeStatusCode(200)->decodeResponseJson();

Ответ 4

Я столкнулся с подобной проблемой и не смог получить $this- > getResponse() → getContent(), работая со встроенным методом $this- > get(). Я пробовал несколько вариантов без успеха.

Вместо этого мне пришлось изменить вызов, чтобы вернуть полный ответ HTTP и получить содержимое из этого.

// Original (not working)
$content = $this->get('/v1/users/1')->getContent();

// New (working)
$content = $this->call('GET', '/v1/users/1')->getContent();

Ответ 5

Просто хочу поделиться, я использовал то же самое в $this->json() как:

$response = $this->json('POST', '/order', $data)->response->getContent();

Но я добавил еще одну строку, чтобы использовать ответ json и декодировать, иначе decodeResponseJson() не работал для меня.

$json = json_decode($response);

Ответ 6

Простой способ:

$this->getJson('api/threads')->content()

Ответ 7

Нашли лучший способ:

$response = $this->json('POST', '/order', $data)->response->getOriginalContent();

Этот метод возвращает ответ json в виде массива.