2017-02-16 9 views
1

Laravel 5.4でphpunitでを使用していくつかのHTTPテストを実行しています。私がassertEqualsを使って私のモデルで他のテストを実行するとき、私は通常どのプロパティ、フィールドなどが予想よりも異なっているかについて非常に良いフィードバックを得る。しかし、assertJsonメソッドは、の違いがありますが、は違いがありますか?の違いがあることを通知します。たとえば、のは、私は、このJSONを返すルートmy/routeを持っているとしましょう:LaravelでのHTTPテスト時のJSONの違いを表示

{ 
    "name": "test", 
    "foo": "bar" 
} 

私はこのLaravelのテストを実行する可能性がある:予想通り

$response = $this->get("my/route"); 

$response->assertJson([ 
    'name' => 'test', 
    'foo' => 'baz', 
]); 

私のテストは失敗します。しかし、結果のメッセージはかなり役に立たないです:より大きな応答で非自明例えば

Failed asserting that an array has the subset Array &0 (
    'name' => 'test' 
    'foo' => 'baz' 
). 

が、それはJSONレスポンスの間で異なっているかを把握しようとするためにはかなり迷惑得ることができます。 何かが2つの間で異なることを知るのではなく、期待された出力と実際の出力の具体的な違いを見る方法はありますか?

+0

JSONレスポンスは多次元ですか? –

+0

@RossWilsonはい、おそらく。これは、特定のリクエストではなく、一般的なhttpテストのためのものですが、多次元JSONを返すルートは間違いなくあります。 –

答えて

0

アサーションをtry-catchにラップしてアサーションが失敗した場合、新しいメッセージを作成して新しい例外をスローすることができます。

/** 
* @test 
* @group new 
*/ 
public function testExample() 
{ 
    $response = $this->get('test'); 

    try { 
     $expected = [ 
      'name' => 'test', 
      'foo' => 'barz', 
     ]; 

     $response->assertJson($expected); 
    } catch (\Exception $e) { 

     $exporter = new \SebastianBergmann\Exporter\Exporter(); 

     $message = 'The following items we\'re expected to be different ' . 
      $exporter->export($this->arrayRecursiveDiff($expected, $response->decodeResponseJson())); 

     throw new \PHPUnit_Framework_ExpectationFailedException($message); 
    } 
} 

public function arrayRecursiveDiff($array1, $array2) 
{ 
    $return = []; 

    foreach ($array1 as $key => $value) { 
     if (is_array($array2) && array_key_exists($key, $array2)) { 
      if (is_array($value)) { 
       $recursiveDiff = $this->arrayRecursiveDiff($value, $array2[$key]); 
       if (count($recursiveDiff)) { 
        $return[$key] = $recursiveDiff; 
       } 
      } else { 
       if ($value != $array2[$key]) { 
        $return[$key] = $value; 
       } 
      } 
     } else { 
      $return[$key] = $value; 
     } 
    } 

    return $return; 
} 

arrayRecursiveDiff方法が完全にテストされていませんのでご注意ください、しかし、多次元配列を比較する方法についてはあちこちにかなりの数の異なる例があります。

希望すると便利です。

関連する問題