Laravel 11单元测试报错:Call to a member function connection() on null
问题原因
你当前的测试类继承了PHPUnit原生的PHPUnit\Framework\TestCase,这个类不会启动Laravel应用容器,也不会初始化数据库连接。而你的UserService内部依赖Eloquent模型操作数据库,所以调用时会出现Call to a member function connection() on null错误——控制器里能正常运行是因为Laravel容器已经完整启动了。
解决方案
1. 替换测试父类
将测试类的父类改为Laravel提供的Tests\TestCase,它会自动初始化应用容器和数据库连接:
修改后的测试代码:
<?php namespace Tests\Unit; use App\Services\UserService; use Tests\TestCase; // 替换为Laravel的测试基类 class UserTest extends TestCase { protected $userService; protected function setUp(): void { parent::setUp(); $this->userService = $this->app->make(UserService::class); } public function test_create_user(): void { $userArray = [ 'nome' => 'John Doe', 'email' => '2V4e3@example.com', 'login' => 'johndoe', 'status' => 1 ]; $user = $this->userService->create($userArray); $this->assertEquals($userArray['email'], $user->email); // 用assertEquals更符合测试语义 } }
2. 配置测试数据库(可选但推荐)
为了避免测试数据污染生产数据库,建议在phpunit.xml中配置内存SQLite数据库:
<server name="DB_CONNECTION" value="sqlite"/> <server name="DB_DATABASE" value=":memory:"/>
同时给测试类添加RefreshDatabase trait,确保每次测试都会重置数据库状态:
use Illuminate\Foundation\Testing\RefreshDatabase; class UserTest extends TestCase { use RefreshDatabase; // ... 其余代码 }
3. 重新运行测试
执行命令:
php artisan test
内容的提问来源于stack exchange,提问作者Fábio Augusto Rodrigues
相关产品推荐
相关产品推荐

