Laravel 9运行PHPUnit测试报错:json方法未定义
错误原因与修复方案
问题根源
$this->json()是Laravel框架提供的功能测试辅助方法,仅在Laravel自带的Tests\TestCase基类中可用。你当前的测试类继承的是纯PHPUnit的PHPUnit\Framework\TestCase,这个基类没有封装HTTP请求相关的方法,因此会触发「未定义方法」的错误。
修复方案(分两种场景)
场景1:这是功能测试(需真实调用API接口)
将测试类的继承基类替换为Laravel提供的Tests\TestCase,同时修正引入的类:
<?php namespace Tests\Unit; // 替换为Laravel框架的测试基类 use Tests\TestCase; class DistrictKindTest extends TestCase { /** * Index method unit test. * * @return void */ public function test_index() { $response = $this->json('GET', '/api/distinct-kinds'); $response->assertStatus(200); } }
注:
Tests\TestCase是Laravel项目默认生成的测试基类,位于tests/TestCase.php,它继承了Illuminate\Foundation\Testing\TestCase,封装了所有HTTP请求、响应断言的辅助方法。如果该文件被误删,可从Laravel官方模板中恢复。
场景2:这是严格的单元测试(仅测试独立逻辑)
如果只是测试DistrictKind相关的业务逻辑(而非完整API请求),则不应使用$this->json(),而是直接测试对应的类(如控制器、服务类),模拟必要依赖:
<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; use App\Http\Controllers\Api\DistrictKindController; class DistrictKindTest extends TestCase { public function test_index() { // 实例化目标类 $controller = new DistrictKindController(); // 模拟依赖(如模型、请求对象,可结合PHPUnit Mock功能) // $mockModel = $this->createMock(DistrictKind::class); // $controller->setModel($mockModel); // 直接调用方法 $response = $controller->index(); // 断言返回结果 $this->assertEquals(200, $response->getStatusCode()); } }
补充说明
Laravel中测试的分工:
- 单元测试:针对独立的类/方法(如模型、服务),不依赖框架完整环境,使用纯PHPUnit的
TestCase。 - 功能测试:针对完整的请求流程(如API、页面),依赖框架环境,使用Laravel提供的
Tests\TestCase。
内容的提问来源于stack exchange,提问作者Taras
相关产品推荐
相关产品推荐

