Как получить данные просмотра во время модульного тестирования в 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');
}
Ответы
Ответ 1
Я нашел лучший способ сделать это. Я написал функцию в TestCase, которая возвращает массив, который я хочу получить из данных вида.
protected function getResponseData($response, $key){
$content = $response->getOriginalContent();
$content = $content->getData();
return $content[$key]->all();
}
Итак, чтобы получить значение из объекта $data, я просто использую $user = $this->getResponseData($response, 'user');
Ответ 2
Внутри теста используйте:
$ 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);
}
}
Должен получить что-то обратно, как на картинке:
![enter image description here]()
Ответ 3
Итак, посмотрим, как реализовано 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
, поэтому я попытаюсь получить доступ к переменным clients
и 'content' через объект $response
.
Если это не сработает, попробуйте выполнить поиск по файлу TestCase
в рамках Laravel... Я уверен, что ответ там где-то. Также попробуйте сбросить объект $response
и посмотреть, как он выглядит, там должны быть некоторые подсказки.
В первую очередь я попытаюсь получить доступ к вашим данным через объект $response
.
Ответ 4
Мне это удалось, сделав это грязным способом. Я использовал assertViewHas
:
$this->assertViewHas('clients', array('1' => 'Client 1', '6' => 'Client2'));
Ответ 5
Вы можете получить доступ к данным в ответе, и его можно проверить.
public function testSimpleLastProducts() {
$res = $this->call('GET', '/');
$this->assertResponseOk();
$this->assertViewHas('lastProducts');
$lastProductOnView = $res->original['lastProducts'];
$this->assertEquals(6, count($lastProductOnView));
}
Ответ 6
Это сработало для меня:
$response->getSession()->get("errors")
И оттуда вы можете проверить содержимое окна сообщения для любой ошибки, которую вы, возможно, захотите проверить.
Ответ 7
Ища что-то подобное в 2019 году, я получил:
$response->getData()->data[0]->...my properties
Все еще ищу более простой способ получить к нему доступ.