単体テストを作成していて、応答で返されたJSON
構造をテストしたいと思います。 TestResponse
がassertJsonStructure
応答の構造と一致するメソッドJSON
を提供していることを知っています。しかし、何らかの理由で$structure
を応答にマップできず、結果としてテストが失敗します。必要なスニペットを共有しましょう。
エンドポイント応答
{
"status": true,
"message": "",
"data": [
{
"id": 2,
"name": "Shanelle Goodwin",
"email": "[email protected]",
"created_at": "2017-03-05 16:12:49",
"updated_at": "2017-03-05 16:12:49",
"user_id": 1
}
]
}
テスト関数
public function testEndpoint(){
$response = $this->get('/api/manufacturer/read', [], $this->headers);
$response->assertStatus(200);
$response->assertJsonStructure([
'status',
'message',
'data' => [
{
'id',
'name',
'email',
'created_at',
'updated_at',
'user_id'
}
]
]);
var_dump("'/api/manufacturer/read' => Test Endpoint");
}
data
配列には複数のノードが存在する可能性があるので、構造体で配列について言及しようとしたのですが、正しくマッピングされていないようです。
幸い、さまざまなオプションを試してみて、この問題を解決しました。配列内のネストされたオブジェクトと一致させる場合、キーとして「*」が期待されます。ここで参照を確認できます。
array of
objects`にこのような構造を設定しました
$response->assertJsonStructure([
'status',
'message',
'data' => [
'*' => [
'id',
'name',
'email',
'created_at',
'updated_at',
'user_id'
]
]
]);
そして、もしあなたが単一のオブジェクトだけにマッチしたいなら
$response->assertJsonStructure([
'status',
'message',
'data' => [
[
'id',
'name',
'email',
'created_at',
'updated_at',
'user_id'
]
]
]);
私はあなたが使うべきだと思います:
$response->assertJsonStructure([
'status',
'message',
'data' => [
[ // change here
'id',
'name',
'email',
'created_at',
'updated_at',
'user_id'
] // change here
]
]);