Насмешливый фасад пароля в Laravel 4

Я пытаюсь написать тесты phpunit для нескольких действий контроллера. Кажется, все в порядке, кроме насмешки над фасадом пароля.

Одно из действий («забыл пароль») выглядит так:

if (Auth::check())
    //return a redirect since the user is already logged in

switch ($response = Password::remind(Input::only('email')))
{
    case Password::INVALID_USER:
        //return a redirect with error messages

    case Password::REMINDER_SENT:
        //return a redirect with success message flushed
}

И Auth, и Password являются фасадами и поставляются с Laravel по умолчанию.

Тестирование части Auth::check() работает отлично:

Auth::shouldReceive('check')->
    once()->
    andReturn(false);  //or true depending on my test case

Но когда я пытаюсь сделать ту же попытку для вызова Password::remind(), это не работает:

Password::shouldReceive('remind')->
    once()->
    andReturn(Password::INVALID_USER);

Я получаю исключение «Отказано в доступе к SQLSTATE», означающее, что приложение пытается получить доступ к БД.

Я также пытался добавить with(array()) в свой тест или даже привязать Mockery::mock('\Illuminate\Auth\Reminders\PasswordBroker') - ничего из этого не помогло.

Как можно протестировать это действие контроллера? Почему фасад пароля отличается от аутентификации? Что еще я должен попробовать?

Спасибо


person MaGnetas    schedule 10.02.2015    source источник


Ответы (1)


Поэтому я провел еще несколько поисков, кодирования и расследования. Наконец-то мне это удалось, хотя это должно было сработать так, как я изначально планировал.

Я читал в документации Laravel, что вызов Facade::shouldReceive('method') должен возвращать объект Mockery. Итак, я попробовал это в своем тесте:

var_dump(get_class(Auth::shouldReceive('check')));
var_dump(get_class(Password::shouldReceive('remind')));

Первый работал, как и ожидалось, но пароль не работал. Итак, почитав Интернет еще немного, пройдясь по фасадам Laravel и поставщикам услуг, я, наконец, пришел к чему-то.

Я издеваюсь над объектом PasswordBroker (в любом случае это то, на что ссылается фасад пароля) и «представляю его» IoC.

$this->authReminder = Mockery::mock('Illuminate\Auth\Reminders\PasswordBroker');
App::instance('auth.reminder', $this->authReminder);

А потом я использую этот объект вместо фасада пароля следующим образом:

$this->authReminder->
    shouldReceive('remind')->
    once()->
    andReturn(Password::INVALID_USER);

Я знаю, что это не объясняет, почему насмешка над фасадом не работает с паролем, но, по крайней мере, после многих часов борьбы я могу написать нужные мне тесты и продолжить проект.

person MaGnetas    schedule 11.02.2015