初めてMockeyを使ってSNS認証テストを書いています。
解決したい事: does not exist on this mockが表示される原因を知りたいです。
グーグルログイン機能のテストをしていますが、登録部分のテストで下記のエラーが表示されてしまいます。
error
1Expected status code 302 but received 500. 2Failed asserting that 302 is identical to 500. 3 4Mockery\Exception\BadMethodCallException: Method Mockery_3_Laravel_Socialite_Contracts_Provider::stateless() does not exist on this mock object
エラーの内容としては"3回目のMockで作っているものに対してstateless()を当てているけど、そもそもstateless()を当てるものが無いよ”と言う捉え方をしていますが、あっているのでしょうか?
test
1<?php 2 3namespace Tests\Feature; 4 5use Illuminate\Foundation\Testing\RefreshDatabase; 6use Illuminate\Foundation\Testing\WithFaker; 7use Tests\TestCase; 8use App\User; 9use Socialite; 10use Mockery; 11 12class SnsLoginTest extends TestCase 13{ 14 use WithFaker; 15 use RefreshDatabase; 16 /** 17 * A basic feature test example. 18 * 19 * @return void 20 */ 21 public function setUp(): void 22 { 23 parent::setUp(); 24 25 Mockery::getConfiguration()->allowMockingNonExistentMethods(false); 26 27 $this->user = Mockery::mock('Laravel\Socialite\Two\User'); 28 $this->user->shouldReceive('getId') 29 ->andReturn(uniqid()) 30 ->shouldReceive('getEmail') 31 ->andReturn(uniqid().'@test.com') 32 ->shouldReceive('getName') 33 ->andReturn('testman'); 34 35 $this->provider = Mockery::mock('Laravel\Socialite\Contracts\Provider'); 36 $this->provider->shouldReceive('user')->andReturn($this->user); 37 38 } 39 40 public static function tearDownAfterClass(): void 41 { 42 Mockery::getConfiguration()->allowMockingNonExistentMethods(true); 43 } 44 45 public function test_Googleアカウントでユーザー登録できる() 46 { 47 $this->withoutExceptionHandling(); 48 49 Socialite::shouldReceive('driver')->with('google')->andReturn($this->provider); 50 51 $response = $this->get(route('google_login_after')); 52 53 $response->assertStatus(302); 54 } 55}
controller
1public function __construct() 2{ 3 $this->middleware('guest')->except('logout'); 4} 5 6public function redirectToGoogle() 7{ 8 return Socialite::driver('google')->redirect(); 9} 10 11public function GoogleCallback() 12{ 13 $gUser = Socialite::driver('google')->stateless()->user(); 14 $check_user = User::where(['email' => $gUser->getEmail()])->first(); 15 if($check_user) { 16 。。。。省略 17 } 18 19}
web
1Route::get('/login/google', 'Auth\LoginController@redirectToGoogle')->name('google_login_before'); 2Route::get('/login/google/callback', 'Auth\LoginController@GoogleCallback')->name('google_login_after');
model
1<?php 2 3namespace App; 4 5// use Illuminate\Contracts\Auth\MustVerifyEmail; 6use Illuminate\Foundation\Auth\User as Authenticatable; 7use Illuminate\Notifications\Notifiable; 8use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract; 9use Illuminate\Auth\MustVerifyEmail; 10 11class User extends Authenticatable implements MustVerifyEmailContract 12{ 13 use MustVerifyEmail, Notifiable; 14 15 /** 16 * The attributes that are mass assignable. 17 * 18 * @var array 19 */ 20 protected $fillable = [ 21 'name', 'email', 'password', 22 ]; 23 24 /** 25 * The attributes that should be hidden for arrays. 26 * 27 * @var array 28 */ 29 protected $hidden = [ 30 'password', 'remember_token', 31 ]; 32 33 public function sendEmailVerificationNotification() 34 { 35 $this->notify(new \App\Notifications\VerifyEmailJapanese); 36 }
試したこと
1, php artisan config:clear
2, $this->user->getName()などで値が取得できるか
3, $this->getJsonにして変化がないか
怪しいと思うところ
エラー文でMockery_3_....と出ていたので3回目のMock呼び出し部分が怪しいのではとみています。3回目に当たるのが下記の1行目の部分です。
stateless()もエラー文に含まれていたのでその部分も気になりました。
$this->provider = Mockery::mock('Laravel\Socialite\Contracts\Provider'); $gUser = Socialite::driver('google')->stateless()->user(); $response = $this->get(route('google_login_after'));
どこに原因があるのか分からず作業が止まってしまいました。
お分かりになる方居ましたら、知恵を貸して頂きたいです。
laravel 7.x
php 7.4.8
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/28 08:43