You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:58:10