Я просто перемещаю приложение с laravel 5.3 до 5.4.
В laravel 5.3 в моих тестах API я мог проверить, что каждая запись в ответе имеет атрибуты со следующим кодом:
$this->json('get', '/api/course-types')
->seeJsonStructure([
'*' => ['id', 'aaa', 'bbb', 'ccc', 'ddd']
]);
Как я могу сделать то же самое с Laravel 5.4?
Там нет такого метода в Осветить / Фонд / Тестирование / TestResponse
я верить ты ищешь assertJson()
или же assertExactJson()
,
От документы:
Метод assertJson преобразует данный массив в JSON, а затем проверяет, присутствует ли фрагмент JSON где-либо в пределах всего ответа JSON, возвращаемого приложением. Таким образом, если в ответе JSON есть другие свойства, этот тест будет проходить до тех пор, пока присутствует данный фрагмент.
И соответствующий код:
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(200)
->assertJson([
'created' => true,
]);
assertExactJson()
будет искать точное совпадение, тогда как assertJson()
просто проверяет наличие ваших параметров в ответе. Надеюсь, поможет!
Функциональность тестирования browserkit была заменена на Laravel Dusk. Оригинальная функциональность была перенесена в собственный пакет: Laravel / браузер комплект тестирования.
Этот пакет предоставляет слой обратной совместимости для тестирования BrowserKit в стиле Laravel 5.3 на Laravel 5.4.
Вам нужно будет следовать инструкциям по установке и использованию этого пакета, и тогда ваши существующие тесты будут работать так же, как в 5.3.
я использую seeJsonStructure()
тоже много, поэтому я взломал небольшую замену, чтобы разместить в своем собственном TestCase
, Надеюсь, это кому-нибудь пригодится, или кто-то может посоветовать мне лучшее решение:
Добавлено в мой TestCase
:
public function seeJsonStructure(TestResponse $response = null, array $structure = null, $responseData = null)
{
if ($response && !$responseData) {
$responseData = $response->decodeResponseJson();
}
if (is_null($structure)) {
return $response->assertJson($responseData);
}
foreach ($structure as $key => $value) {
if (is_array($value) && $key === '*') {
$this->assertInternalType('array', $responseData);
foreach ($responseData as $responseDataItem) {
$this->seeJsonStructure(null, $structure['*'], $responseDataItem);
}
} elseif (is_array($value)) {
$this->assertArrayHasKey($key, $responseData);
$this->seeJsonStructure(null, $structure[$key], $responseData[$key]);
} else {
$this->assertArrayHasKey($value, $responseData);
}
}
return $this;
}
Затем мне пришлось обновить свои тесты, поэтому я передаю ответ в качестве первого аргумента при вызове этого метода. Пример для SomeTest
:
$response = $this->json('POST', $url, [
'id' => $user->id
]);
$this->seeJsonStructure($response, [
'id', 'first_name', 'last_name', 'email'
]);
Оригинальный метод Laravel был: https://github.com/laravel/browser-kit-testing/blob/85f9a14a63bf5a287740002fcbc4352587f8a113/src/Concerns/MakesHttpRequests.php#L348