2013-04-07 2 views
2

Я пытаюсь сделать свой тест AuthController. Я начинаю с инъекционным класс Auth, так что я могу дразнить его в моем тесте:Как мне высмеять класс Auth в Laravel 4?

public function __construct(Auth $auth) 
{ 
    $this->auth = $auth; 
} 

Затем я использую нагнетаемый класс позже, когда я проверяю, если Логин удалось:

public function postLogin() 
{ 
    // instead of Auth::attempt(Input::all()) 
    if ($this->auth->attempt(Input::all()) { 
     return 'you are logged in!'; 
    } else { 
     return 'login failed!'; 
    } 
} 

Когда я представляю моя форма Войти Я получаю сообщение об ошибке, что метод Auth::attempt не определен:

FatalErrorException: Error: Call to undefined method Illuminate\Support\Facades\Auth::attempt() ... 

что я делаю неправильно? Я видел этот exact technique, используемый в моделях, но, видимо, он не работает для класса Auth.

ответ

2

Ну, вы могли бы делать это здесь не так ...

ТЛ; дг

Определить макет Auth адаптер и настроить Auth использовать что в тестах. Использование статических методов Auth в контроллерах просто отлично.

Почему это работает ...

Пакет Auth implements a Driver (aka Adapter) pattern с классом действия Auth в качестве менеджера зависимостей и одноточечного интерфейса для всего пакета. Вместо того, чтобы пытаться внедрить интуитивный экземпляр Auth в ваш контроллер, вы должны реализовать макет адаптера Auth (например, адаптеры Eloquent и Fluent по умолчанию). Также попробуйте configuring your Auth to use the In-Memory Adapter во время тестов. На странице руководства (для ленивых) с акцент шахты:

В-памяти Sessions

«память» Драйвер сеанса просто использует простой массив для хранения данных сеанса для текущего запроса. Этот драйвер идеально подходит для тестирования вашего приложения, поскольку на диск ничего не записывается. Его никогда не следует использовать в качестве «реального» сеансового драйвера.

Адаптер памяти - это всего лишь массив в памяти, и поскольку ваши тесты обмениваются потоками с системным тестированием (SUT), вы можете свободно проверять содержимое сеанса из вашего тестового кода, чтобы проверить его -эффекты аутентификации и пост-условия.

+0

Спасибо! Я полагал, что это был более низкий уровень, чем этот. Я собирался попытаться сделать приложение: instance (...) в тесте для UserProviderInterface, теперь, когда я снова просмотрел видео, но это имеет больший смысл. –

11

При использовании Auth класса вы можете издеваться его с помощью:

Auth::shouldReceive('attempt')->once()->andReturn(true) 

Таким образом, ваш facade будет издевался!

Надеюсь, это поможет!