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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:22:02