Как я могу проверить фильтр auth в Laravel 4.1?

Я хочу написать модульный тест, который должен проверить, может ли неавторизованный пользователь просматривать список пользователей (который он не должен быть в состоянии).

мои маршруты

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');
});

результат

не удалось утверждать, что освещает объектHttpResponse (...) является экземпляром класса "IlluminateHttpRedirectResponse".

Если я войдите в $response из теста, он показывает полный список пользователей, например, если администратор вошел в систему во время тестирования.

Если я перейду к администратору / пользователям, использующим браузер без входа в систему, я перенаправлен на вход, как и должен, поэтому фильтр auth действительно работает.

вопросы

  1. есть ли что-то в Laravel, что входит в первый пользователь во время тестирования для вас по умолчанию? Или Auth:: guest () всегда false по умолчанию во время тестирование?
  2. если да, то как мне выйти из системы во время модульного тестирования? Я попробовал $this - >be (null), но получил сообщение об ошибке, что переданный объект должен реализовать UserInterface.

1 ответов


фильтры Laravel автоматически отключаются для модульных тестов; их необходимо включить для конкретного тестового случая.

Route::enableFilters();

или это, если вы не заинтересованы в использовании статических фасадов

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

посмотрите в документации по модульному тестированию.

теперь ваш тест должен вернуть правильный тип объекта, позволяющий пройти тест.