2017-02-16 3 views
1

Я запускаю некоторые HTTP-тесты в Laravel 5.4, в основном используя assertJson helper method с phpunit. Когда я запускаю другие тесты на своих моделях, используя assertEquals, я обычно получаю очень хорошие отзывы о том, какие свойства, поля и т. Д. Отличаются от ожидаемых. Тем не менее, метод assertJson только говорит мне, что там есть отличия, но не что эти отличия есть. Например, предположим, что у меня есть маршрут my/route, который возвращает этот JSON:Просмотр различий JSON при тестировании HTTP в Laravel

{ 
    "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. Есть ли способ просмотреть конкретные различия между ожидаемыми и фактическими выходами, а не просто знать, что что-то отличается от двух?

+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 не полностью протестирован, однако, существует довольно много различных примеров, плавающих вокруг, как сравнивать многомерные массивы.

Надеюсь, это поможет!

Смежные вопросы