Dusk测试报错:SQLite数据库不存在,测试可访问控制器无法访问
我来帮你排查这个头疼的Dusk数据库访问问题——核心矛盾是测试本身能正常访问数据库,但控制器处理/articles请求时却找不到库,咱们一步步拆解解决:
1. 先核对.env.dusk.local的数据库配置,避免混合冲突
你提到同时出现了SQLite和Homestead数据库的错误,大概率是配置文件里的参数冲突了。先明确你要使用的数据库类型:
如果你用SQLite作为Dusk测试库:
确保配置是纯SQLite的,路径必须是绝对路径(尤其注意宿主和虚拟机的路径映射):
DB_CONNECTION=sqlite # 示例:宿主机器的绝对路径,或者虚拟机内的绝对路径 DB_DATABASE=/home/vagrant/code/your-project/database/dusk.sqlite
别同时保留MySQL的DB_HOST/DB_DATABASE等参数,会让Laravel混淆连接逻辑。
如果你用Homestead的MySQL:
确保配置和虚拟机的数据库完全匹配,注意端口是宿主映射后的端口(Homestead默认是33060):
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=33060 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret
2. 验证Homestead虚拟机内的数据库是否真的存在
登录虚拟机(vagrant ssh),手动检查数据库状态:
# 登录MySQL mysql -uhomestead -psecret # 查看所有数据库 SHOW DATABASES;
如果homestead数据库不在列表里,手动创建:
CREATE DATABASE homestead;
3. 确保测试与控制器使用相同的数据库连接
检查你的测试类是否使用了RefreshDatabase或DatabaseMigrations trait——这些trait会自动初始化测试数据库,但要确保它们没有硬编码指定其他连接。比如,测试里如果写了$this->usingDatabase('test_db'),那控制器也要对应使用这个连接。
另外,可以在控制器的/articles方法里临时加一行调试代码,看看实际加载的数据库配置:
dd(config('database.connections.mysql')); // 或者对应你的连接名
运行测试后看输出,对比.env.dusk.local的配置,确认是否一致。
4. 清除配置缓存,避免旧配置干扰
修改.env.dusk.local后,一定要清除Laravel的配置缓存,不然Dusk可能还在读取旧的配置:
# 宿主机器上执行(如果测试在宿主跑) php artisan config:clear php artisan dusk:clear # 如果测试在虚拟机内跑,登录虚拟机后执行同样的命令
5. 最后确认权限问题
你提到权限看起来没问题,但还是要确认Dusk数据库文件(如果是SQLite)的读写权限:
# 宿主机器上 chmod 664 database/dusk.sqlite chown www-data:www-data database/dusk.sqlite # 如果用的是Apache/Nginx的用户
虚拟机内也要对应检查文件权限,确保Laravel进程能读写。
内容的提问来源于stack exchange,提问作者Camilo

