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

Laravel首个功能测试报错Call to a member function connection() on null原因

Laravel功能测试报错:Call to a member function connection() on null 原因分析

在编写首个Laravel功能测试时,遇到如下错误:

Call to a member function connection() on null

以下是相关配置及测试代码:

测试代码

class LocationTest extends TestCase
{
    public function setUp(): void
    {
        $location = new Location();
        $location->name      = 'My Location';
        $location->city      = 'My City';
        $location->state     = 'My State';
        $location->country   = 'My Country';
        $location->latitude  = 123.456;
        $location->longitude = 789.012;

        $location->save();
    }

    /**
     * A basic feature test example.
     */
    public function test_index(): void
    {
        $response = $this->get('/locations');
        $this->assertEquals(200, $response->getStatusCode());
        $content = $response->getContent();
        // $this->assertJson($response->getContent());
        print "";
    }
}

.env配置

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5433
DB_DATABASE=weather_app
DB_USERNAME=user
DB_PASSWORD=password

phpunit.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
    bootstrap="vendor/autoload.php"
    colors="true">
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <source>
        <include>
            <directory suffix=".php">./app</directory>
        </include>
    </source>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="DB_CONNECTION" value="pgsql"/>
        <env name="DB_DATABASE" value="weather_app"/>
        <env name="MAIL_MAILER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
    </php>
</phpunit>

database.php中的PostgreSQL配置

'pgsql' => [
    'driver'         => 'pgsql',
    'url'            => env('DATABASE_URL'),
    'host'           => env('DB_HOST', '127.0.0.1'),
    'port'           => env('DB_PORT', '5432'),
    'database'       => env('DB_DATABASE', 'forge'),
    'username'       => env('DB_USERNAME', 'forge'),
    'password'       => env('DB_PASSWORD', ''),
    'charset'        => 'utf8',
    'prefix'         => '',
    'prefix_indexes' => true,
    'search_path'    => 'public',
    'sslmode'        => 'prefer',
],

错误原因及修复方案

1. 核心原因:未初始化Laravel测试环境

测试类重写了setUp()方法,但没有调用父类的parent::setUp(),导致Laravel框架的测试初始化流程未执行,数据库连接等核心服务未被实例化,调用$location->save()时自然找不到数据库连接,抛出connection() on null错误。

修复:在setUp()方法开头添加父类初始化调用:

public function setUp(): void
{
    parent::setUp(); // 必须添加这一行
    // 后续创建Location实例的代码
}

2. 测试环境数据库配置不完整

phpunit.xml中仅配置了DB_CONNECTION和DB_DATABASE,缺少DB_HOST、DB_PORT、DB_USERNAME、DB_PASSWORD这几个必要的数据库连接参数,测试环境无法正确连接PostgreSQL。

修复:在phpunit.xml的<php>节点中补充完整数据库配置:

<env name="DB_HOST" value="127.0.0.1"/>
<env name="DB_PORT" value="5433"/>
<env name="DB_USERNAME" value="user"/>
<env name="DB_PASSWORD" value="password"/>

3. 可选优化:使用测试专用数据库

建议为测试环境单独创建数据库(如weather_app_test),避免污染开发数据库,同时确保该数据库已在PostgreSQL中创建,且配置的数据库用户拥有读写权限。


内容的提问来源于stack exchange,提问作者Fil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:27:46