Как получить данные просмотра во время модульного тестирования в Laravel

Я хотел бы проверить, что массив, заданный для представления в функции контроллера, имеет определенные пары значений ключа. Как это сделать с помощью тестирования phpunit?

//my controller I am testing public function getEdit ($user_id) { $this->data['user'] = $user = \Models\User::find($user_id); $this->data['page_title'] = "Users | Edit"; $this->data['clients'] = $user->account()->firstOrFail()->clients()->lists('name', 'id'); $this->layout->with($this->data); $this->layout->content = \View::make('user/edit', $this->data); } //my test public function testPostEdit (){ $user = Models\User::find(parent::ACCOUNT_1_USER_1); $this->be($user); $response = $this->call('GET', 'user/edit/'.parent::ACCOUNT_1_USER_1); //clients is an array. I want to get this //array and use $this->assetArrayContains() or something $this->assertViewHas('clients'); $this->assertViewHas('content'); } 

Я нашел лучший способ сделать это. Я написал функцию в TestCase, которая возвращает массив, который я хочу получить из данных вида.

 protected function getResponseData($response, $key){ $content = $response->getOriginalContent(); $content = $content->getData(); return $content[$key]->all(); } 

Поэтому, чтобы получить значение из объекта $ data, я просто использую $user = $this->getResponseData($response, 'user');

Итак, посмотрим, как реализована assertViewHas ЗДЕСЬ, похоже, что делает этот метод, является доступ к данным вида после этого вызова:

 $response = $this->client->getResponse()->original; 

В вашем коде строка:

 $response = $this->call('GET', 'user/edit/'.parent::ACCOUNT_1_USER_1); 

по существу возвращает то же самое, что и строка над ним, а именно: \Illuminate\Http\Response (которая расширяет компонент symfony \HttpFoundation\Response )

Таким образом, внутри функции assertViewHas похоже, что laravel обращается к данным с помощью $response->$key , поэтому я бы попытался получить доступ к переменным «client» и «content» через объект $response .

Если это не сработает, попробуйте выполнить поиск по файлу TestCase в рамках Laravel … Я уверен, что ответ там где-то. Также попробуйте сбросить объект $response и посмотреть, как он выглядит, там должны быть некоторые подсказки.

Первое, что я хотел бы попробовать, – это доступ к вашим данным через объект $response .

Внутри тестового примера используйте:

$ data = $ this-> response-> getOriginalContent () -> getData ();

Пример:

 <?php use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class HomeTest extends TestCase { /** * A basic test example. * * @return void */ public function testExample() { $data = $this->response->getOriginalContent()->getData(); // do your tests on the data } } 

Пример демпинга данных, чтобы вы могли видеть, что в массиве данных передано для просмотра:

 <?php use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class HomeTest extends TestCase { /** * A basic test example. * * @return void */ public function testExample() { $data = $this->response->getOriginalContent()->getData(); dd($data); } } 

Должно получиться что-то вроде того, что в образе:

введите описание изображения здесь

Это сработало для меня:

 $response->getSession()->get("errors") 

И оттуда вы можете проверить содержимое окна сообщения для любой ошибки, которую вы, возможно, захотите проверить.

Вы можете получить доступ к данным в ответе, и их можно проверить.

 public function testSimpleLastProducts() { $res = $this->call('GET', '/'); $this->assertResponseOk(); $this->assertViewHas('lastProducts'); $lastProductOnView = $res->original['lastProducts']; $this->assertEquals(6, count($lastProductOnView)); } 

Мне это удалось, сделав это грязным способом. Я использовал assertViewHas :

 $this->assertViewHas('clients', array('1' => 'Client 1', '6' => 'Client2'));