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

Dusk测试报错:SQLite数据库不存在,测试可访问控制器无法访问

解决Dusk测试中控制器无法访问数据库的问题

我来帮你排查这个头疼的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:24:48