当期望单个对象时,Laravel API Illuminate \ Foundation \ Testing \ TestResponse空数组

时间:2019-02-26 22:00:31

标签: laravel laravel-5 guzzle

为什么从Laravel的单元测试中,如果我执行以下请求,将json响应解码,则返回为空数组:

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

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

对同一个URL执行最基本的get请求,会得到一个不错的json响应。

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

谢谢


编辑:我发现了为什么发生此行为。 从单元测试来看,我正在使用的Laravels隐式路由模型绑定失败。因此,尽管我认为它应该返回一个json对象(因为它是来自Postman的),但实际上它返回的是null,因为这可能是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));
}

所以我在这个简单的任务上浪费了一个小时,因为我以为“它很明显可以工作,我可以在Postman上看到它。”

2 个答案:

答案 0 :(得分:1)

关于响应的laravel文档:

  

json方法将自动将Content-Type标头设置为   application / json,并使用将指定的数组转换为JSON   json_encode PHP函数:

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

请注意给定数组字,您将给json()方法一个空参数,然后您将得到该参数。

您可以在此处查看有关如何测试json api的一些示例:https://laravel.com/docs/5.7/http-tests

答案 1 :(得分:0)

根据我的编辑,这是一个隐式路由模型绑定不适用于我的单元测试的问题。这是一个已知的问题,它本身并不是“错误”,只是没有很好地记录在案: Can't test routes that use model binding (when using WithoutMiddleware trait)