Laravel 7.x PHPUnit报错connection() on null,配置是否合规?求解
Laravel测试数据库连接报错:Call to a member function connection() on null
嘿,我来帮你一步步分析问题:
一、你的配置是否正确?
整体配置思路没问题,但有个小笔误需要修正:
.env.testing里的DB_DATABASE路径写的是C:/wamp64/wwww/myApp/test.sqlite,这里多了一个w(应该是www而不是wwww),和phpunit.xml里的路径不一致,这个得改过来,不然可能会找不到数据库文件。- 补充说明:
phpunit.xml中的<server>节点配置会覆盖.env.testing的对应变量,所以哪怕.env.testing写错,测试时会优先用phpunit的配置,但还是建议把两个文件的路径统一,避免后续混淆。 - 另外要确保
myApp目录有写入权限,这样Laravel才能自动创建test.sqlite文件(如果它还不存在的话)。
二、报错的核心原因
这个错误的根源在你的测试类继承关系上:
你的CodeTest继承的是PHPUnit\Framework\TestCase——这是PHPUnit的原生基础类,它不会初始化Laravel的应用容器。而你用的DatabaseMigrations是Laravel提供的Trait,它完全依赖Laravel容器里的数据库服务实例。当Trait尝试调用数据库连接时,因为容器根本没启动,相关服务都是null,自然就抛出了Call to a member function connection() on null的错误。
三、快速解决办法
把测试类的父类换成Laravel自带的Tests\TestCase就行,修改后的代码如下:
namespace Tests\Unit; use Illuminate\Foundation\Testing\DatabaseMigrations; use Tests\TestCase; // 替换成Laravel的基础测试类 class CodeTest extends TestCase { use DatabaseMigrations; public function test_can_push_data() { $this->assertTrue(true); } }
这样测试类运行时会自动初始化Laravel应用容器,DatabaseMigrations Trait就能正常获取数据库连接、执行迁移操作了。
内容的提问来源于stack exchange,提问作者sasori
相关产品推荐
相关产品推荐

