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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:45:30