Laravel与PestPHP单测试用例中多用户切换登录异常问题
Laravel测试中actingAs()无法切换用户的解决方案
我之前也遇到过一模一样的问题!在多用户操作的测试用例里,第一次用actingAs()设置的用户身份就像“粘”在会话里一样,不管后续怎么调用actingAs()切换,甚至手动调用Auth::logout()都没用。后来才搞清楚是Laravel测试客户端的会话状态保留导致的,给你两个最有效的解决办法:
方法一:切换用户前重置认证状态
Laravel的测试基类(TestCase)提供了resetAuth()方法,专门用来清空当前的认证状态。你只需要在切换用户前调用它就行:
// 创建将要发布帖子的用户 $user = User::factory()->subscriber()->active()->create(); // 创建将要关注上述用户的用户 $follower = User::factory()->subscriber()->active()->create(); // 以follower身份登录并执行关注操作 $this->actingAs($follower)->post('/ajax/follow/User/'.$user->id); // 关键:重置认证状态,清空之前的用户身份 $this->resetAuth(); // 尝试以$user身份登录并发布帖子 $request = ['id' => 1,'body' => 'I have a body']; $response = $this->actingAs($user)->post('/posts/add',$request);
这个方法会直接重置测试环境中的认证实例,让后续的actingAs()能正确绑定新用户。
方法二:使用fresh()创建全新的测试客户端
如果resetAuth()没起作用,你可以用fresh()方法创建一个不带任何之前会话状态的新测试客户端,这样就能完全摆脱之前的用户身份:
// 创建将要发布帖子的用户 $user = User::factory()->subscriber()->active()->create(); // 创建将要关注上述用户的用户 $follower = User::factory()->subscriber()->active()->create(); // 以follower身份登录并执行关注操作 $this->actingAs($follower)->post('/ajax/follow/User/'.$user->id); // 用fresh()创建新客户端,再绑定$user身份 $request = ['id' => 1,'body' => 'I have a body']; $response = $this->fresh()->actingAs($user)->post('/posts/add',$request);
fresh()会初始化一个全新的测试客户端实例,所有之前的会话、认证信息都会被清空,相当于重新开始一个测试流程。
为什么直接调用Auth::logout()没用?
你之前尝试的Auth::logout()其实是操作当前请求的认证实例,但Laravel测试客户端会在内部维护自己的会话状态,直接调用门面方法不会影响测试客户端保存的会话数据。必须使用测试类提供的resetAuth()或fresh()才能真正清空测试环境的会话状态。
你可以在测试中加几个dd(auth()->user())来验证:重置或调用fresh()后,当前用户应该是null,再调用actingAs($user)后才会变成目标用户。
内容的提问来源于stack exchange,提问作者eResourcesInc
相关产品推荐
相关产品推荐

