Laravel测试调用actingAs()报错:传入Collection而非Authenticatable实现类
错误原因
actingAs()方法要求传入的第一个参数是实现了Illuminate\Contracts\Auth\Authenticatable接口的单个用户实例,你当前的代码存在两个问题触发了报错:
- 测试代码中
User::factory(3)->create()传入了数量参数3,执行后返回的是包含3个用户模型的Illuminate\Database\Eloquent\Collection集合对象,并非单个用户实例,直接传入actingAs()就会触发类型不匹配错误。 - User模型存在trait重复引入问题:你的User类已经继承了
Illuminate\Foundation\Auth\User(别名Authenticatable),该父类已经内置了Authenticatable接口的实现,类内部额外写use Authenticatable属于重复加载,可能引发逻辑异常。
解决方案
1. 修正测试代码
如果只需要单用户登录测试,直接不传数量参数调用工厂,得到单个用户实例:
public function test_can_get_clipart() { $this->withoutExceptionHandling(); // 不传参数,生成单个用户实例 $user = User::factory()->create(); $this->actingAs($user, 'api'); $this->getJson('/api/cliparts') ->assertStatus(201); }
如果确实需要批量生成3个用户再取其中一个登录,改为取集合的第一个元素即可:
$user = User::factory(3)->create()->first();
2. 修正User模型
删除User类中重复的trait引入即可:
class User extends Authenticatable { // 删掉重复的Authenticatable引用,保留其他trait use HasFactory, Notifiable, HasApiTokens, Uuid; // 剩余原有代码保持不变 protected $fillable = [ 'name', 'email', 'password', ];
修改完成后重新运行测试即可解决该报错。
内容的提问来源于stack exchange,提问作者Bình Nguyễn
相关产品推荐
相关产品推荐

