Попытка издеваться над Laravel Socialite Логин Google для интеграционного тестирования

Я пытаюсь издеваться над Laravel Socialite, чтобы протестировать вход в Google oAUTH, используя руководство здесь.

use Laravel\Socialite\Facades\Socialite;
use Laravel\Socialite\Two\GoogleProvider;
use Laravel\Socialite\Two\User as SocialUser;

public function mock_socialite ($email = '[email protected]', $token = 'foo', $id = 1)
    {
        // create a mock user
        $socialiteUser = $this->createMock(SocialUser::class);
        $socialiteUser->token = $token;
        $socialiteUser->id = $id;
        $socialiteUser->email = $email;

        // create a mock provider of the user
        $provider = $this->createMock(GoogleProvider::class);
        $provider->expects($this->any())
            ->method('user')
            ->willReturn($socialiteUser);

        // create a mock Socialite instance
        $stub = $this->createMock(Socialite::class);
        $stub->expects($this->any())
            ->method('driver')
            //->with('google')
            ->willReturn($provider);

        // Replace Socialite Instance with our mock
        $this->app->instance(Socialite::class, $stub);
    }

Однако я получаю следующую ошибку:

Trying to configure method "driver" which cannot be configured 
because it does not exist, has not been specified, is final, or is static

Я проверил и обнаружил, что метод driver() существует в Illuminate\Support\Manager (откуда Socialite расширен), и этот метод является общедоступным. Не уверен, почему я получаю эту ошибку.


person hashbrown    schedule 16.07.2019    source источник


Ответы (1)


Socialite — это фасад, и часто их интеграция далека от того, как вы бы его использовали, поэтому у него нет метода драйвера. Вы включаете этот фасад, чтобы поиздеваться над ним, это не тот подход, который он использует в руководстве. Таким образом, замена фасада на оператор использования, который он использует, вероятно, решит ваши проблемы.

use Laravel\Socialite\Contracts\Factory as Socialite;

Вместо.

use Laravel\Socialite\Facades\Socialite;
person mrhn    schedule 16.07.2019
comment
Спасибо за подсказку. Позвольте мне попробовать это и сообщить вам. - person hashbrown; 17.07.2019
comment
Нет, он все еще не работает. Теперь он жалуется на Laravel\\Socialite\\Two\\InvalidStateException - person hashbrown; 18.07.2019
comment
Но в вашем коде нет ничего, что ссылается на это? - person mrhn; 18.07.2019
comment
Я предполагаю, что это не то, что вы правильно связываете социальный макет, могу ли я увидеть контроллер/логику, которую вы вызываете с этими макетами - person mrhn; 18.07.2019
comment
Да, ты прав. Я вызывал Socialite::buildProvider() непосредственно в своем контроллере, в то время как я привязывал макет к методу driver. - person hashbrown; 19.07.2019