2017-01-26 1 views
0

Я просто перемещаю приложение с laravel 5.3 до 5.4. В Laravel 5.3 в моих тестах API я мог убедиться, что каждая запись в ответ дал атрибуты с помощью следующего кода:Как утверждать в laravel 5.4, что каждая запись в списке имеет хотя бы заверенные атрибуты?

$this->json('get', '/api/course-types') 
     ->seeJsonStructure([ 
      '*' => ['id', 'aaa', 'bbb', 'ccc', 'ddd'] 
     ]); 

Как я могу сделать то же самое с Laravel 5.4?

Там нет такого метода в Illuminate/Foundation/Testing/TestResponse

+0

Да, это пошло. Вы можете использовать 'assertJson' или вы можете реплицировать [код для' seeJsonStructure'] (https://github.com/laravel/framework/blob/5.3/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php#L341 -L374). Чтобы быть ясным, это никогда не было в «TestResponse», а скорее в признаке «MakesHttpRequests». – bishop

ответ

2

Я верю вы ищете assertJson() или assertExactJson().

Из docs:

The assertJson method converts the given array into JSON, and then verifies that the JSON fragment occurs anywhere within the entire JSON response returned by the application. So, if there are other properties in the JSON response, this test will still pass as long as the given fragment is present.

И соответствующий код:

$response = $this->json('POST', '/user', ['name' => 'Sally']); 

$response 
    ->assertStatus(200) 
    ->assertJson([ 
     'created' => true, 
    ]); 

assertExactJson() будет искать точное совпадение, а assertJson() просто проверяет существование ваших параметров в ответ. Надеюсь, поможет!

+0

Я хочу проверить структуру resposne неконтент. Это не работает. – gandra404

1

Функциональность тестирования браузера была заменена на Laravel Dusk. Исходная функциональность была перенесена в собственный пакет: laravel/browser-kit-testing.

This package provides a backwards compatibility layer for Laravel 5.3 style "BrowserKit" testing on Laravel 5.4.

Вам необходимо будет следовать инструкциям по установке и использованию этого пакета, а затем ваши существующие тесты будут работать так же, как в 5.3.

+0

Не работает. Тот же тест завершился неудачно с двумя ошибками: 1) 'PHPUnit_Framework_Exception: аргумент # 1 (нет значения) PHPUnit_Framework_Assert :: assertJson() должен быть строкой 2)' Ошибка: вызов неопределенного метода. Тесты \ Feature \ ExampleTest :: assertStatus() ' – gandra404

+0

@ gandra404 Похоже, вы смешиваете два набора тестов. Класс тестирования может использовать только новую функциональность тестирования (Laravel Dusk) или старые функции тестирования (BrowserKit). 'seeJsonStructure()' доступен только в наборе тестов BrowserKit. 'assertStatus()' доступен только в наборе тестов Dusk. – patricus

+0

Это очень странно. Я пишу тесты для приложения API backend.Нет визуальных интерфейсов, только конечные точки REST и основная вещь, которую я ожидаю от одной конечной точки: - чтобы увидеть ответ json - проверить код http status - проверить, что ответ json имеет определенную структуру и теперь у меня есть разделить ths в 2 различных тестах? Если это правда, у меня возникает новая проблема. – gandra404

0

Я также использую seeJsonStructure(), поэтому я взломал небольшую замену, чтобы разместить в моем собственном TestCase. Надеюсь, что это полезно для кого-то, или кто-то может посоветовать мне на лучшее решение:

добавляю в TestCase:

public function seeJsonStructure(TestResponse $response = null, array $structure = null, $responseData = null) 
{ 
    if ($response && !$responseData) { 
     $responseData = $response->decodeResponseJson(); 
    } 
    if (is_null($structure)) { 
     return $response->assertJson($responseData); 
    } 
    foreach ($structure as $key => $value) { 
     if (is_array($value) && $key === '*') { 
      $this->assertInternalType('array', $responseData); 
      foreach ($responseData as $responseDataItem) { 
       $this->seeJsonStructure(null, $structure['*'], $responseDataItem); 
      } 
     } elseif (is_array($value)) { 
      $this->assertArrayHasKey($key, $responseData); 
      $this->seeJsonStructure(null, $structure[$key], $responseData[$key]); 
     } else { 
      $this->assertArrayHasKey($value, $responseData); 
     } 
    } 
    return $this; 
} 

Затем мне пришлось обновить свои тесты, поэтому я передать ответ в качестве первого аргумента при вызове этого метода. Пример SomeTest:

$response = $this->json('POST', $url, [ 
    'id' => $user->id 
]); 

$this->seeJsonStructure($response, [ 
    'id', 'first_name', 'last_name', 'email' 
]); 

оригинальный метод Laravel был: https://github.com/laravel/browser-kit-testing/blob/85f9a14a63bf5a287740002fcbc4352587f8a113/src/Concerns/MakesHttpRequests.php#L348

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