【发布时间】:2014-09-13 07:07:51
【问题描述】:
我正在尝试按照 TDD 启动一个新的 Laravel 应用
我的第一步是检查 /login 控制器是否在 home url 上调用。
尽管遵循了几个教程,但我无法进行测试,而且我根本看不出我做错了什么。
我的设置是: 作曲家安装 laravel 作曲家安装phpunit
这是我的路线:
<?php
Route::get('/login', 'AuthenticationController@login');
我的控制器:
<?php
class AuthenticationController extends BaseController {
public function login () {
return View::make('authentication.login');
}
}
我的测试:
<?php
class AuthenticationTest extends TestCase {
public function testSomeTest () {
$response = $this->action('GET', 'AuthenticationController@login');
$view = $response->original;
$this->assertEquals('authentication.login', $view['name']);
}
}
我得到的错误是
ErrorException: Undefined index: name
从 Laravel 站点复制的代码(几乎完全一样),但它没有运行。
谁能看出我做错了什么?
它声称 $view 没有索引名称,但这不能像 laravel 网站上的示例那样正确,而且视图正在使用它的名称呈现(它也在前端正确显示)
编辑::
因此,从评论看来,laravel 单元测试部分并不清楚,并且 $view['name'] 正在检查一个名为 $name 的变量。如果是这种情况,你如何测试使用的控制器/路由,IE。路由('X')使用了什么控制器名称/动作名称
【问题讨论】:
-
$view['name']不是视图的名称,而是视图上可用的变量$name。但是你没有传递任何东西给它。在您的控制器中,它应该是例如return View::make('authentication.login')->with('name', 'John');,然后您想测试$name是否可从视图中获得并包含“John”:$this->assertEquals('John', $view['name']);。 -
真的吗?然后文档具有误导性。那么我如何测试我的控制器是否在某个路线上触发?或者我如何获得用于特定路线的控制器/动作的名称?
-
我不太确定你想要达到什么目的。如果您想对应用程序进行单元测试,这不涉及测试路由是否调用了正确的控制器方法或控制器是否加载了正确的视图。这是 Laravel 功能的一部分,并且已经过测试。您想测试是否调用了控制器中的正确方法以及响应是什么。你不需要测试哪个路由调用哪个控制器方法,你只需调用触发你真正想要测试的控制器方法的路由。
-
我想这是有道理的。我的想法是 id 编写一个测试,登录操作将被称为默认/主路由。那么如果用户未登录,我会检查另一条路由是否重定向到登录路由。但是如果我无法获取正在使用的路由或控制器,我将如何测试未经授权的用户是否被重定向到登录路由/控制器?我想 $response = $this->call('GET', 'admin/users'); $this->assertRedirectedTo('admin/login');是我唯一能做的事情(尽管它确实做了我想做的事。
-
是的,因为这就是您要测试的内容。在您的单元测试中,您只想知道是否根据用户是否登录触发了正确的操作。在您的情况下,您检查响应是否是重定向到某个路由。就是这样。您不在乎之后会发生什么或调用哪个控制器 - 这超出了单元测试的范围。您只想检查您的应用程序是否对给定的输入给出了预期的响应。设置经过身份验证的用户,调用路由并检查您是否被重定向到“管理员/用户”,否则例如到“用户/登录”。
标签: php unit-testing laravel-4 phpunit