如何在Laravel 4.1中对auth过滤器进行单元测试?

时间:2014-03-22 17:15:44

标签: unit-testing laravel laravel-4 phpunit

我想写一个单元测试,应该检查未经身份验证的用户是否可以查看用户列表(他不应该这样做)。

我的路线

Route::group(array('prefix' => 'admin'), function() {
    Route::get('login', function() {
        return View::make('auth.login');
    });
    Route::post('login', function() {
        Auth::attempt( array('email' => Input::get('email'), 'password' => Input::get('password')) );
        return Redirect::intended('admin');
    });
    Route::get('logout', 'AuthController@logout');

    Route::group(array('before' => 'auth'), function() {
        Route::get('/', function() {
            return Redirect::to('admin/users');
        });
        Route::resource('users', 'UsersController');
    });
});

我的测试

public function testUnauthenticatedUserIndexAccess() {
    $response = $this->call('GET', 'admin/users');

    $this->assertRedirectedTo('admin/login');
}

我的过滤器

Route::filter('auth', function() {
    if (Auth::guest()) return Redirect::guest('admin/login');
});

结果

无法断言Illuminate \ Http \ Response Object(...)是“Illuminate \ Http \ RedirectResponse”类的实例。

如果我从测试中记录$响应,它会显示完整的用户列表,就像管理员在测试期间登录一样。

如果我在没有登录的情况下使用浏览器浏览管理员/用户我被重定向到像我应该登录的那样,那么auth过滤器确实有用。

问题

  1. Laravel中是否存在默认情况下在测试期间登录第一个用户的内容?或者,在测试期间,Auth :: guest()默认是否为false?
  2. 如果是这样,我如何在单元测试期间“退出”?我尝试了$ this-> be(null)但是错误地说传递的对象必须实现UserInterface。

1 个答案:

答案 0 :(得分:18)

Laravel过滤器会自动禁用单元测试;您需要为特定的测试用例启用它们。

Route::enableFilters();

或者如果您不热衷于使用静态外观

$this->app['router']->enableFilters();

Take a look in the unit testing documentation.

您的测试现在应该返回正确的对象类型,以允许您的测试通过。