我想检查给定一个控制器函数中的视图的数组是否具有某些键值对。我如何使用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');
}
答案 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);
}
}
应该像图片中的内容一样回复:
答案 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 上测试