前提・実現したいこと
User::factory()->create()で作ったテストユーザーを使い、認証済み時のテストを行いたい。
発生している問題・エラーメッセージ
User::factory()->create();で作成した$userを使用し、actingAsでログインのユーザを指定しているが、下記の型エラーが発生している。
コードは、laravel8のドキュメントを参考に書きました。
ページ検索でactingAsで検索すると、私が見た箇所がピックアップされるはずです。
Expected type 'Illuminate\Contracts\Auth\Authenticatable'. Found 'Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model'
該当のソースコード
PHPUnit
1<?php 2 3namespace Tests\Feature; 4 5use App\Models\User; 6use Illuminate\Foundation\Testing\RefreshDatabase; 7use Illuminate\Foundation\Testing\WithFaker; 8use Tests\TestCase; 9 10class FavoriteTest extends TestCase 11{ 12 public function test_favorite_screen_can_be_rendered() 13 { 14 $user = User::factory()->create(); 15 $response = $this->actingAs($user)->get('/'); 16 17 $response->assertSee('ユーザー'); 18 $response->assertSee('タイトル'); 19 $response->assertSee('カテゴリ'); 20 21 $response->assertStatus(200); 22 } 23}
Laravel8ドキュメントから引用
FROMlaravel8Doc
1<?php 2 3namespace Tests\Feature; 4 5use App\Models\User; 6use Tests\TestCase; 7 8class ExampleTest extends TestCase 9{ 10 public function test_an_action_that_requires_authentication() 11 { 12 $user = User::factory()->create(); 13 14 $response = $this->actingAs($user) 15 ->withSession(['banned' => false]) 16 ->get('/'); 17 } 18}
UserModel
1<?php 2 3namespace App\Models; 4 5use Illuminate\Contracts\Auth\MustVerifyEmail; 6use Illuminate\Database\Eloquent\Factories\HasFactory; 7use Illuminate\Foundation\Auth\User as Authenticatable; 8use Illuminate\Notifications\Notifiable; 9use Laravel\Sanctum\HasApiTokens; 10 11class User extends Authenticatable 12{ 13 use HasApiTokens, HasFactory, Notifiable; 14 15 protected $fillable = [ 16 'name', 17 'email', 18 'profile', 19 'password', 20 ]; 21 22 protected $hidden = [ 23 'password', 24 'remember_token', 25 ]; 26 27 protected $casts = [ 28 'email_verified_at' => 'datetime', 29 ]; 30} 31
###試したこと
まっさらなlaravelに、laravel/breezeを導入したデフォルトで用意されているテストコードでも同様の型エラーが起きていました。
これは、laravel側の欠陥なんでしょうか?
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。