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
相关产品推荐
相关产品推荐

