Ошибка модульного теста Laravel, не найден соответствующий обработчик для Auth::attempt

Кажется, у меня возникла проблема с моим тестом входа в систему с условиями. Мой обработчик входа проверяет правильность адреса электронной почты и пароля, а также подтверждение пользователя. Проходят следующие тестовые случаи:

public function test_redirect_to_login_if_login_fails()
{
    // enable filters to test login
    Route::enableFilters();
    // some fake credentials to use
    $credentials = [
        'email'=>'[email protected]',
        'password'=>'badpassword',
        'confirmed'=>1
    ];
    // mock the Auth class
    Auth::shouldReceive('attempt')
        ->once()
        ->with($credentials)
        ->andReturn(false);
    // call the login post with the credentials
    $this->call('POST','login',$credentials);
    // assert that we are redirected back to the entry page
    $this->assertRedirectedToRoute('entry');
}

public function test_redirect_if_login_success()
    {
        // enable filtere to test login
        Route::enableFilters();
        // some fake credentials to use
        $credentials = [
            'email'=>'[email protected]',
            'password'=>'Pa55w0rd',
            'confirmed'=>1
        ];
        // mock the Auth class
        Auth::shouldReceive('attempt')
            ->once()
            ->with($credentials)
            ->andReturn(true);
        // call the login post with the proper credentials
        $response = $this->call('POST','login',$credentials);
        // assert the response is good
        $this->assertTrue($response->isRedirection());
    }

Это, однако, дает мне ошибку, хотя это очень похоже на первый тестовый пример выше:

public function test_redirect_if_user_is_not_confirmed()
    {
        // enable filters to test login
        Route::enableFilters();
        // some fake credentials to use
        $credentials = [
            'email'=>'[email protected]',
            'password'=>'badpassword',
            'confirmed'=>0
        ];

        // mock the Auth class
        Auth::shouldReceive('attempt')
            ->once()
            ->with($credentials)
            ->andReturn(false);
        // call the login post with the credentials
        $this->call('POST','login',$credentials);
        // assert that we are redirected back to the entry page
        $this->assertRedirectedToRoute('entry');
    }

Ошибка:

Mockery\Exception\NoMatchingExpecationException: не найден соответствующий обработчик для Mockery_0_Illumnate_Auth_AuthManager::attempt(array('email'=>'[email protected]','password'=>'badpassword','confirmed'=>1,)). Либо метод был неожиданным, либо его аргументы не соответствовали ожидаемому списку аргументов для этого метода.

Мой метод контроллера:

public function store()
{
    if (Auth::attempt(array("email"=>Input::get('email'),"password"=>Input::get('password'),'confirmed'=>1)))
    {
        return Redirect::intended('home');
    }
    return Redirect::route("entry")->with("danger",Lang::get('orientation.invalid'))->withInput();
}

person gin93r    schedule 29.12.2014    source источник


Ответы (1)


Ваш тест не работает правильно - потому что вы предоставляете тесту неправильные данные.

У вас есть макет Auth для получения:

Auth::shouldReceive('attempt')
        ->once()
        ->with($credentials)
        ->andReturn(false);

В частности, что он должен получить ->with($credentials). Но вы определили $credentials как наличие confirmed => 0, когда ваш контроллер всегда будет отправлять confirmed => 1, потому что это жестко запрограммировано.

Вместо этого вы все еще должны ожидать получения confirmed => 1 в своем тесте, но имитировать возврат false, потому что соответствующая запись не найдена.

Это должно работать:

// some fake credentials to use
        $credentials = [
            'email'=>'[email protected]',
            'password'=>'badpassword',
            'confirmed'=>1
        ];
person Laurence    schedule 30.12.2014
comment
Спасибо за ответ. confirmed не является полем ввода. Обычный процесс заключается в том, что пользователь регистрируется, получает электронное письмо, которое затем устанавливает столбец confirm от 0 до 1 в моей таблице пользователей. Мое понимание из документов Laravel (см. Аутентификация пользователя с условиями) было что если мне нужно установить другие требования, например подтвержденный статус, это делается так. Если это не правильный способ сделать это, знаете ли вы правильный способ? - person gin93r; 30.12.2014