Я также использую 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
Да, это пошло. Вы можете использовать 'assertJson' или вы можете реплицировать [код для' seeJsonStructure'] (https://github.com/laravel/framework/blob/5.3/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php#L341 -L374). Чтобы быть ясным, это никогда не было в «TestResponse», а скорее в признаке «MakesHttpRequests». – bishop