Laravel Dusk测试遇401:如何在访问页面前设置浏览器会话?
Laravel Dusk 中设置浏览器会话解决401权限问题
问题描述
我是Laravel Dusk新手,最近刚开始使用它。测试方法如下:
public function test_show_new_customer(): void { $this->login()->use_application(6); $this->browse(function (Browser $browser) { $browser->loginAs($this->user) ->visit(new NewCustomerPage()) ->assertTitle('New Customer'); }); }
执行测试时出现401错误,触发错误的中间件代码:
public function handle(Request $request, Closure $next): Response { $has_app_access = User::hasAppAccess(session('business.id')); if (!$has_app_access) { abort(401); } return $next($request); }
错误原因是session('business.id')返回null,找不到对应的会话,导致验证用户无应用访问权限。想知道在Laravel Dusk中是否可以在访问页面之前设置浏览器会话?
解决方案
当然可以,Laravel Dusk的Browser实例提供了withSession方法,专门用来在浏览器访问页面之前设置会话数据。
你需要在loginAs之后、visit之前调用withSession,把business.id注入到浏览器的会话中。修改后的测试代码如下:
public function test_show_new_customer(): void { $this->login(); $businessId = 6; $this->browse(function (Browser $browser) use ($businessId) { $browser->loginAs($this->user) ->withSession(['business.id' => $businessId]) ->visit(new NewCustomerPage()) ->assertTitle('New Customer'); }); }
关键说明
- 之前的
use_application(6)是在测试代码所在的进程中设置会话,但Dusk的浏览器是独立的Chrome进程,两者会话不共享,所以直接调用use_application无法同步到浏览器会话里。 withSession方法会把指定的键值对添加到浏览器的会话中,这样中间件就能正确获取到business.id,通过权限验证。
内容的提问来源于stack exchange,提问作者rpurant
相关产品推荐
相关产品推荐

