Laravel Dusk+Docker+多租户:如何在companyx.localhost类子域名运行测试?
解决Laravel Sail环境下Dusk访问多租户子域名的问题
一、Docker/Sail容器配置补全
你已经给Selenium容器添加了extra_hosts,但还要确保Laravel应用容器也能解析子域名(测试代码运行在该容器内,需正确生成子域名路由):
- 打开项目根目录的
docker-compose.yml,找到services.app节点,添加extra_hosts配置:extra_hosts: - "companyx.localhost:host-gateway" - "laravel.test:host-gateway" - 重启Sail使配置生效:
sail down -v && sail up -d
二、Laravel Dusk环境配置修正
- 完善
.env.dusk.local的关键配置:APP_URL=http://companyx.localhost SESSION_DOMAIN=.localhost # 允许所有localhost子域名共享会话 APP_ENV=local - 清除Dusk环境的配置缓存,避免旧配置干扰:
sail artisan config:clear --env=dusk.local
三、Dusk测试代码的子域名适配
默认Dusk启动逻辑可能忽略自定义子域名,需在tests/DuskTestCase.php中手动指定基准访问域名:
protected function driver() { $options = (new ChromeOptions)->addArguments([ '--disable-gpu', '--headless=new', '--window-size=1920,1080', ]); return RemoteWebDriver::create( 'http://selenium:4444/wd/hub', DesiredCapabilities::chrome()->setCapability( ChromeOptions::CAPABILITY, $options ), // 指定子域名作为基准URL 'http://companyx.localhost', 5000 ); }
若需测试多个租户,可在测试用例中动态指定访问地址:
$this->browse(function (Browser $browser) { $browser->visit('http://companyx.localhost/login') ->type('email', 'test@companyx.com') ->type('password', 'password') ->press('Login') ->assertPathIs('/dashboard'); });
四、验证配置有效性
- 进入Selenium容器,测试子域名解析:
能ping通则说明容器内解析正常。sail exec selenium ping companyx.localhost - 进入Laravel应用容器,验证路由生成:
在tinker中执行:sail artisan tinker --env=dusk.local
应返回route('tenant.dashboard', [], false, 'companyx.localhost')http://companyx.localhost/dashboard,说明路由生成正确。
内容的提问来源于stack exchange,提问作者Sebas
相关产品推荐
相关产品推荐

