Laravel API Illuminate \ Foundation \ Testing \ TestResponse пустой массив при ожидании одного объекта - PullRequest
0 голосов
/ 27 февраля 2019

Почему из модульного теста в Laravel, если я выполняю следующий запрос, декодирую ответ json, он возвращается в виде пустого массива:

$response = $this->get(route('api.inspections.get', [
    "id" => $inspection->id
]));

$apiInspection = $response->json(); # Empty array :(

И все же выполняет самый простой запрос get длятот же URL дает мне хороший ответ json.

$inspection = file_get_contents(route('api.inspections.get', [
    "id" => $inspection->id
]));
$inspection = json_decode($inspection); # The expected inspection stdClass

Спасибо


Редактировать: я обнаружил, почему это происходит. Похоже, из устройстватесты, неявное связывание модели маршрута Laravels, которое я использовал, терпит неудачу.Поэтому, хотя я думал, что это должен был бы вернуть объект json (потому что это было из Почтальона), он фактически возвращал ноль из-за того, что, по-видимому, является ошибкой в ​​Laravel.

# So this api controller action works from CURL, Postman etc - but fails from the phpunit tests
public function getOne(InspectionsModel $inspection) {
    return $inspection;
}

Так что мне пришлось изменить это на

public function getOne(Request $request) {
    return InspectionsModel::find($request->segment(3));
}

Так что я потратил час на эту простую задачу только потому, что подумал: «Это ясно работает, я вижу это в Почтальоне».

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Согласно моим изменениям, это проблема с неявной привязкой модели маршрута, не работающей из моих модульных тестов.Это известная проблема, которая не является «ошибкой» как таковой, просто плохо документирована: Невозможно протестировать маршруты, использующие привязку модели (при использовании черты WithoutMiddleware)

0 голосов
/ 27 февраля 2019

Из документов laravel об ответах:

Метод json автоматически устанавливает заголовок Content-Type на application / json, а также преобразует данный массив в JSON с помощью PHP-функции json_encode:

return response()->json([
    'name' => 'Abigail',
    'state' => 'CA' ]);

Обратите внимание на данный массив слов, вы даете методу json () пустой аргумент, и вы получите его взамен.

Выможете проверить здесь некоторые примеры того, как проверить json api: https://laravel.com/docs/5.7/http-tests

...