2014-01-15 2 views
8

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

//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'); 

} 
+0

это чистый phpunit? – hek2mgl

+0

в основном утверждения phpunit, однако он использует структуру laravel. – Nicola

+0

'assertViewHas()' не является базовым расширением phpunit. Наверное, вы используете материал Селена? – hek2mgl

ответ

3

Так, глядя на то, как assertViewHas реализован HERE он выглядит, что делает метод, является доступ к данным зрения после этого вызова:

$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 и переменные «содержание» через $response объекта.

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

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

+0

спасибо за рытье для меня - я не думал об этом. Я не думаю, что он действительно может получить к нему доступ. Я сделал 'var_dump'' response', который выводит объект. Объект имеет частное свойство 'data', которое является массивом. Объект данных содержит «клиенты», однако, конечно, данные защищены, поэтому я не могу получить к нему доступ. Я смотрел в классах для возвратных функций. Их нет, и я не хочу редактировать. – Nicola

0

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

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

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

protected function getResponseData($response, $key){ 

    $content = $response->getOriginalContent(); 

    $content = $content->getData(); 

    return $content[$key]->all(); 

} 

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

+0

'$ content [key] -> all()' действует как '$ user-> all()' и возвращает всех пользователей! Мой разум был взорван, что это происходит, и я не могу объяснить, как это происходит. Мне пришлось удалить '-> all()', чтобы работать для меня в Laravel 5.3. В любом случае это чистый код. Thanx –

0

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

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

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

0

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

public function testSimpleLastProducts() {   

    $res = $this->call('GET', '/'); 

    $this->assertResponseOk(); 

    $this->assertViewHas('lastProducts'); 

    $lastProductOnView = $res->original['lastProducts']; 

    $this->assertEquals(6, count($lastProductOnView));  

} 
3

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

$ Данные = $ этом-> 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

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