【问题标题】:How do i unit test the auth filter in Laravel 4.1?如何在 Laravel 4.1 中对 auth 过滤器进行单元测试?
【发布时间】:2014-04-30 03:01:46
【问题描述】:

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

我的路线

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 对象 (...) 是“Illuminate\Http\RedirectResponse”类的实例。

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

如果我在没有登录的情况下使用浏览器浏览到管理员/用户,我将被重定向到我应该登录的位置,因此身份验证过滤器确实在工作。

问题

  1. 默认情况下,Laravel 中有什么东西会在测试期间为您登录第一个用户吗?还是 Auth::guest() 在测试过程中默认总是假的?
  2. 如果是这样,我如何在单元测试期间“退出”?我尝试了 $this->be(null) 但得到一个错误,说传递的对象必须实现 UserInterface。

【问题讨论】:

    标签: unit-testing laravel laravel-4 phpunit


    【解决方案1】:

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

    Route::enableFilters();
    

    如果您不喜欢使用静态外观,也可以这样做

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

    Take a look in the unit testing documentation.

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

    【讨论】:

    • 你拯救了我的一天。谢谢!
    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2015-11-05
    • 2020-04-09
    • 2015-01-23
    相关资源
    最近更新 更多