web-dev-qa-db-fra.com

Correspond à JsonStructure dans le test PhpUnit - Laravel 5.4

Je crée un test unitaire et souhaite tester la structure JSON renvoyée dans la réponse. Je sais que TestResponse fournit une méthode assertJsonStructure pour correspondre à la structure de votre réponse JSON. Mais pour une raison quelconque, je ne peux pas mapper le $structure à ma réponse et le test échoue. Permettez-moi de partager les extraits requis.

Réponse du point final

{
   "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
       }
    ]
}

Fonction de test

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");
}

Il peut y avoir plusieurs nœuds dans le tableau data, c'est pourquoi j'ai essayé de mentionner le tableau dans la structure, mais il semble qu'il ne mappe pas correctement.Toute aide serait appréciée :-)

26

Heureusement, en jouant avec différentes options, j'ai résolu ce problème. Un "*" est attendu comme clé si nous devons faire correspondre un objet imbriqué dans un tableau. Nous pouvons voir la référence ici.

Source: TestResponse - ligne # 36

J'ai défini la structure comme ceci pour array ofobjets`

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

Et si vous voulez faire correspondre un seul objet

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

Je pense que vous devriez utiliser:

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