【发布时间】:2013-05-12 12:28:09
【问题描述】:
我正在尝试在我正在构建的新 Laravel 应用程序中包含单元测试。 现在我想测试我的 OrderController。该控制器的 index 方法如下所示:
public function index()
{
// We need the extra 'orders()' for the query scope
$orders = $this->order->orders()->paginate($this->perPage);
$this->layout->content = View::make('orders.index', compact('orders'));
}
现在我的测试看起来像这样:
public function testIndex()
{
$this->call('GET', 'orders');
$this->assertResponseOk();
$this->assertViewHas('orders');
}
现在如果我运行 phpunit,测试确实会运行,但我得到:1) OrderControllerTest::testIndex
Failed asserting that an array has the key 'orders'.
我已经找到了使用控制器布局$this->layout 的问题。
如果我只是做return View::make() 测试确实通过了,如果我返回$this->layout... 它也确实通过了,但这会破坏实际的应用程序。
所以我发现的唯一选择是使用return View::make() 并在该视图中使用@extends('master')。但是如果你想测试它,你不能在你的应用程序中使用控制器布局,这对我来说似乎很奇怪。
我做错了吗?
【问题讨论】:
-
测试失败的原因是因为Orders.Index视图被渲染到了布局中,所以到你测试的时候,orders变量已经渲染出来了,不再存在了。我不确定最好的测试方法是什么......您可以检查 orders.index 视图是否在单独的测试中包含 orders 变量,然后检查组合视图是否包含“内容”变量,但这就是我的全部能想到。
标签: php unit-testing controller laravel laravel-4