Laravel8使用sqlite测试报General error:1 no such table错误如何解决
问题排查与解决步骤
- 首先解决互斥Trait冲突:你的测试类同时引入了
RefreshDatabase和DatabaseMigrations两个数据库处理Trait,二者功能互斥,同时使用会导致迁移逻辑混乱、表未正确创建,删除其中一个即可,Laravel8测试场景推荐保留RefreshDatabase。 - 排查模型解析异常:报错SQL直接将
App\Models\UnitType作为表名查询,说明框架未正确读取模型配置的$table属性,按以下顺序验证:- 确认测试类顶部已经正确引入UnitType模型:
use App\Models\UnitType;,未引入的情况下类名会被直接当作字符串传入断言方法,导致框架无法读取模型的表配置 - 在第一个
dd('hit')前添加调试代码dd(UnitType::first());,如果能正常返回你刚才用factory创建的数据,说明模型配置本身没问题,是断言方法的传参解析故障,可以直接换用表名调用断言绕开问题:$this->assertDatabaseHas('unit_types', $results);
- 确认测试类顶部已经正确引入UnitType模型:
- 排查测试环境配置异常:
- 确认
phpunit.xml中没有覆盖数据库配置,升级项目很容易遗留旧版phpunit配置,导致测试时不读取.env.testing的配置,检查phpunit.xml的<php>节点下是否强制指定了错误的数据库连接 - 确认
database/test.sqlite文件已经手动创建,sqlite不会自动生成数据库文件,需要在项目根目录执行touch database/test.sqlite创建空文件后再运行测试 - 临时在测试代码中打印
config('database.connections.sqlite.database'),确认读取到的数据库路径和你配置的一致,避免配置缓存导致测试环境配置不生效
- 确认
- 排查迁移兼容问题:你是从Laravel5升级到8,可手动执行测试环境迁移验证是否有报错:
php artisan migrate --env=testing,确认unit_types表能正常创建。
内容的提问来源于stack exchange,提问作者Aayush Dahal
相关产品推荐
相关产品推荐

