Как получить данные просмотра во время модульного тестирования в 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

Все еще ищу более простой способ получить к нему доступ.