如何在Laravel中进行单元测试期间获取视图数据

时间:2014-01-15 13:42:21

标签: php laravel laravel-4 phpunit

我想检查给定一个控制器函数中的视图的数组是否具有某些键值对。我如何使用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');

}

8 个答案:

答案 0 :(得分:9)

我发现了一种更好的方法。我在TestCase中编写了一个函数,它从视图数据中返回我想要的数组。

protected function getResponseData($response, $key){

    $content = $response->getOriginalContent();

    $content = $content->getData();

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

}

因此,要从$ data对象获取值,我只需使用$user = $this->getResponseData($response, 'user');

答案 1 :(得分:4)

在测试用例中使用:

$ 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

答案 2 :(得分: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访问数据,所以我会尝试通过{{1}访问clients和'内容'变量对象。

如果这不起作用,请尝试在Laravel框架中搜索$response文件...我确定答案就在那里。同时尝试转储TestCase对象并查看它的外观,应该有一些线索。

我要尝试的第一件事是通过$response对象访问您的数据。

答案 3 :(得分:3)

我通过乱糟糟的方式来管理它。我使用assertViewHas

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

答案 4 :(得分:1)

您可以访问响应中的数据并进行检查..

public function testSimpleLastProducts() {        

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

    $this->assertResponseOk();

    $this->assertViewHas('lastProducts');

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

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

}

答案 5 :(得分:0)

这对我有用:

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

从那里,您可以检查消息框的内容,查看您可能需要验证的任何错误。

答案 6 :(得分:0)

在2019年寻找类似的东西,我得到了: $response->getData()->data[0]->...my properties

仍在寻找一种更简单的访问方式。

答案 7 :(得分:0)

我遇到了同样的问题,但我的情况有点特殊,因为我通过 view()->share($params); 推送我的数据查看,在这种情况下,解决方案:$content = $response->getOriginalContent()->getData(); 不提供数据。

而且我无法使用 $response->assertViewHas(...),因为我的数据是对象(模型),我需要验证对象属性(键和 id-s)。

所以我的解决方案是

$data = $response->original->gatherData();
$this->assertSame($currency->key, $data['currency']->key);

在 Laravel 8 上测试