2016-04-15 16 views
1

私は現在、自分のAPIのテストをいくつか書いていますが、これを処理するより良い方法があるかどうかを知りたいのですが、これは "ハッキーな"方法です。統合テストJSON APIレスポンス

以下のコード例:

public function testListingOfAllUsers() 
{ 
    $users = $this->createUsers(); 

    $client = $this->createClient(); 
    $client->request("GET", "https://stackoverflow.com/users/"); 

    $response = $client->getResponse(); 
    $content = $response->getContent(); 
    $decodedContent = json_decode($content); 

    $this->assertTrue($response->isOk()); 
    $this->assertInternalType("array", $decodedContent->data); 
    $this->assertCount(count($users), $decodedContent->data); 

    foreach ($decodedContent->data as $data) { 
     $this->assertObjectHasAttribute("attributes", $data); 
     $this->assertEquals("users", $data->type); 
    } 
} 

より良い私は私のAPIがJSON API仕様と一致してテストするために行うことができます何かがあるのならば、私は思ったんだけど。私を啓発します!私はかなり確かですPHPUnitはここで私の答えではありません。

答えて

3

まず、あなたが今やっているようなJSON構造をプログラム的にアサーションすることは、それ自体が悪い習慣であるとは思っていません。しかし、私はある時点で扱いにくくなる可能性があり、より効率的に解決できることに同意します。

私はしばらく前に同じ問題を抱えて、与えられたJSONドキュメントの構造を検証するためJSON schemataJSONPath expressionsを使用しています(available as open sourceあるhelmich/phpunit-json-assert、)新しい作曲パッケージを書いてしまいました。 JSONスキーマを使用して

次のように、あなたの例のテストケースを書くことができます。

public function testListingOfAllUsers() 
{ 
    $users = $this->createUsers(); 

    $client = $this->createClient(); 
    $client->request("GET", "https://stackoverflow.com/users/"); 

    $response = $client->getResponse(); 
    $content = $response->getContent(); 
    $decodedContent = json_decode($content); 

    $this->assertTrue($response->isOk()); 
    $this->assertJsonDocumentMatchesSchema($decodedContent, [ 
     'type' => 'array', 
     'items' => [ 
      'type'  => 'object', 
      'required' => ['attributes', 'type'], 
      'properties' => [ 
       'attributes' => ['type' => 'object'], 
       'type'  => ['type' => 'string', 'enum' => ['user']] 
      ] 
     ] 
    ]); 
} 

(ライン・オブ・コードに関して)、私はJSONスキーマを鑑賞に来て、もう少し詳細ながこのユースケースでは、広く採用されている規格であり、assert*ステートメントの壁を読むのが簡単です(imho)。また、単体テストのスキーマ定義を別々のファイルに抽出し、他のものを実行することもできます。自動生成のドキュメント(SwaggerもJSONスキーマのサブセットを使用しています)や実行時検証などがあります。

+0

非常に高く評価されています。私は今週あなたのパッケージを見ています。私は正しいことをやっていると感じました。ちょうどもっときれいだと思っただけです。あなたの答えは間違いなく助けになった!再度、感謝します。 – BennyC

関連する問題