Laravel使用PHPUnit测试时报错no such table: users该如何解决?
问题产生原因
- Laravel测试环境默认使用独立于开发环境的数据库配置,默认是内存型SQLite数据库,你本地开发环境的
users表不会同步到测试环境,所以工厂在非测试场景可以正常运行,测试时找不到表 - 测试类没有引入自动数据库迁移的Trait,测试运行前没有创建对应的表结构
- 若你手动修改过
phpunit.xml的测试数据库配置,也可能是没有对应执行测试环境的数据库迁移导致表不存在
解决方法
- 确认测试配置文件
phpunit.xml的数据库配置正确,默认配置如下即可:
<php> <server name="APP_ENV" value="testing"/> <server name="DB_CONNECTION" value="sqlite"/> <server name="DB_DATABASE" value=":memory:"/> </php>
- 在你的测试类中引入
RefreshDatabaseTrait,该Trait会在每一条测试用例执行前自动执行所有迁移、执行完成后重置数据库,既解决表不存在的问题,也可以避免不同测试用例之间的数据污染:
<?php namespace Tests\Feature; use App\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class IndexPageTest extends TestCase { use RefreshDatabase; public function testExistSomeTextsInIndexPage() { // Laravel 7及之前版本写法 $user = factory(User::class)->create(); // Laravel 8及之后版本请改用该写法 // $user = User::factory()->create(); $this->get('/')->assertSee($user->name); } }
- 如果你不想使用默认的内存SQLite数据库,需要用自定义的测试库,可手动执行测试环境迁移命令创建表:
php artisan migrate --env=testing
内容的提问来源于stack exchange,提问作者kaveh.hd
相关产品推荐
相关产品推荐

