web-dev-qa-db-ja.com

PhpUnitテストでJsonStructureを一致させる-Laravel 5.4

単体テストを作成していて、応答で返されたJSON構造をテストしたいと思います。 TestResponseassertJsonStructure応答の構造と一致するメソッド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配列には複数のノードが存在する可能性があるので、構造体で配列について言及しようとしたのですが、正しくマッピングされていないようです。

26

幸い、さまざまなオプションを試してみて、この問題を解決しました。配列内のネストされたオブジェクトと一致させる場合、キーとして「*」が期待されます。ここで参照を確認できます。

ソース:TestResponse-行#36

array ofobjects`にこのような構造を設定しました

$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'
      ]
    ]
  ]);
48

私はあなたが使うべきだと思います:

 $response->assertJsonStructure([
    'status',
    'message',
    'data' => [
      [ // change here
        'id',
        'name',
        'email',
        'created_at',
        'updated_at',
        'user_id'
      ] // change here
    ]
  ]);
1