2017-03-07 1 views
10

단위 테스트를 만들고 있는데 응답에서 반환 된 JSON 구조체를 테스트하려고합니다. TestResponseJSON 응답 구조와 일치하도록 assertJsonStructure 메서드를 제공합니다. 그러나 어떤 이유로 나는 $structure을 내 응답에 매핑 할 수 없으므로 테스트가 실패합니다. 필요한 스 니펫을 공유하겠습니다.PhpUnit 테스트에서 일치하는 JsonStructure - Laravel 5.4

엔드 포인트 응답

{ 
    "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 배열의 여러 노드 내가 구조의 배열을 언급하려하지만 '아무튼 보인다 이유가 그래서 어떤 도움을 주시면 감사하겠습니다 :-)

답변

13

다행스럽게도, 다른 옵션을 가지고 노는 나는이 문제를 해결했다. 배열에서 중첩 된 객체와 일치 시키려면 '*'가 중요합니다. 여기서 우리는 참조를 볼 수 있습니다.

Source: TestResponse - Line # 363

나는 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' 
     ] 
    ] 
    ]); 
+1

매우 유용합니다! 공식 문서에 있어야합니다. 우리를 위해 낚시 해 줘서 고마워. –

+1

내 영웅, 감사합니다 –

+0

[코드가 옮겼습니다] (https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/Testing/TestResponse.php#L363) –

1

나는 다음과 같이 사용해야한다고 생각한다 :

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

자네 말이 맞아하지만이 일치 일치 할 경우 'data' 배열의 단일 객체. 나는이 문제를 해결하고 그것을 아래에 게시했다. 감사합니다 –