Laravel Mock Facade должен получить не работает должным образом

Этот тест не пройден, потому что он никогда не пройдет вызов функции Auth::attempt(). Я поставил заявление dd(), чтобы доказать, что это не сработает.

Если я удалю два Auth::shouldReceive(), код запустит первый оператор dd().

Если я оставлю хотя бы один Auth::shouldReceive(), первый оператор dd() никогда не будет вызван.

Если я добавлю ->twice() вместо ->once(), ошибок не будет, что странно, потому что он должен жаловаться, что он был вызван только один раз.

Если я помещу оператор dd() в первую строку контроллера, он не запустится, пока я не удалю функции Auth::shouldReceive().

Я должен быть чем-то глупым, чего я не понимаю, потому что я просмотрел много руководств.

Контроллер

public function postLogin() {
    $email = Input::get('email');
    $password = Input::get('password');
    dd('Does not make it to this line with auth::shouldReceive() in the test');
    if (Auth::attempt(array('email'=>$email, 'password'=>$password))) {
        dd("Doesn't make it here either with auth::shouldReceive() mock.");
        $user = Auth::user();
        Session::put('user_timezone', $user->user_timezone);
        return Redirect::to('user/dashboard')->with('message', 'You are now logged in!');
    } else {
        return Redirect::to('user/login')->with('message', 'Your username/password combination was incorrect')->withInput();
    }
}

Тест

public function testUserTimezoneSessionVariableIsSetAfterLogin()
{
    $user = new User();
    $user->user_timezone = 'America/New_York';
    $user->email = '[email protected]';
    $user->password = 'test';

    $formData = [
        'email' => '[email protected]',
        'password' => '123',
    ];

    \Auth::shouldReceive('attempt')->once()->with($formData)->andReturn(true);
    \Auth::shouldReceive('user')->once()->andReturn($user);

    $response = $this->call('POST', '/user/login', $formData);
    $this->assertResponseStatus($response->getStatusCode());


    $this->assertSessionHas('user_timezone');
}

person Nick    schedule 26.06.2015    source источник
comment
У вас есть промежуточное ПО на этом маршруте?   -  person BrokenBinary    schedule 26.06.2015
comment
Не то чтобы я в курсе. Только то, что стандартное приложение Laravel включило в файле Kernel.php.   -  person Nick    schedule 26.06.2015
comment
Просто идея, но Auth::user() может быть вызван некоторыми внутренними органами. Измените once() на zeroOrMoreTimes() и посмотрите, сохраняется ли проблема.   -  person BrokenBinary    schedule 26.06.2015
comment
Тот же результат, что и раньше, код в контроллере вообще не вызывается. Я попытался с оператором dd() вверху, и он не выполняется.   -  person Nick    schedule 26.06.2015
comment
Возможно, этот вопрос поможет: stackoverflow.com/a/24033017/919933   -  person Rodrigo Balest    schedule 28.08.2015
comment
Спасибо за ответ Родриго. В сообщении ниже я забыл добавить parent::construct() в конструктор моего контроллера.   -  person Nick    schedule 29.08.2015


Ответы (1)


Проблема заключалась в том, что у меня было parent::construct() в конструкторе моего UserController. По-видимому, это вызывает проблемы с моками.

Я предположил, что это было необходимо, чтобы иметь parent::construct(), потому что у меня был собственный конструктор в UserController.

person Nick    schedule 28.06.2015