Я хотел бы проверить, что массив, заданный для представления в функции контроллера, имеет определенные пары значений ключа. Как это сделать с помощью тестирования 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'));