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

Laravel8用inertia-laravel测试报Not a valid Inertia response错

Laravel 8.40 搭配 inertia-laravel 0.6.3 测试报「Not a valid Inertia response」排查方向

首先明确:换Assert类替代AssertableInertia无法解决问题,因为这个报错的核心原因是测试拿到的响应本身不符合Inertia响应规范,和断言类的选择无关。

按以下优先级逐一排查:

  • 先验证路由基础可用性
    在测试中get('/')之后先加基础断言,先排除非Inertia层面的错误:
    $response = $this->get('/');
    $response->assertStatus(200); // 先确认不是404、500、302重定向(比如未登录跳登录页、路由不存在)
    $response->assertHeader('X-Inertia', 'true'); // Inertia合法响应必须带这个响应头
    
    如果assertStatus失败,直接根据状态码排查对应问题:302检查路由是否挂载了认证等中间件但测试未模拟登录、500检查控制器逻辑是否报错、404检查路由路径是否正确。
    如果assertHeader失败,说明响应根本没经过Inertia处理,继续往下排查。
  • 检查Inertia中间件挂载是否正确
    打开app/Http/Kernel.php,确认\Inertia\Middleware::class已经加入web中间件组,不要错加到api中间件组,也不要被测试里的withoutMiddleware()调用全局禁用——很多人写测试时为了省事调用withoutMiddleware()跳过所有中间件,会直接导致Inertia响应逻辑不生效。
  • 确认控制器返回值正确
    对应路由的控制器必须调用Inertia::render()返回响应,不能返回普通Blade视图、JSON数组、重定向响应。如果组件路径书写错误(比如大小写不对、路径和实际前端组件路径不匹配),也会导致Inertia抛出异常返回错误页而非正常响应。
  • 临时打印响应内容定位问题
    如果上面两步都没发现问题,在测试中临时打印响应头和响应内容,直接看实际返回的是什么:
    $response = $this->get('/');
    dump($response->headers->all());
    dump($response->getContent());
    
    如果返回的是HTML内容,大概率是中间件未生效、或者应用抛出了异常返回了错误页;如果返回的JSON里没有component、props这几个Inertia必填字段,说明控制器返回格式错误。
  • 清理缓存重新加载包依赖
    执行以下命令清理测试环境可能存在的旧缓存:
    php artisan config:clear
    php artisan route:clear
    php artisan package:discover
    
    避免旧的配置缓存、服务提供者缓存导致Inertia服务未正确加载。

调整后的可参考测试代码:

use Inertia\Testing\AssertableInertia;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class HomePageTest extends TestCase
{
    use RefreshDatabase;

    public function test_home_page_sponsors(): void
    {
        $sponsors = Sponsor::factory()->count(5)->create();

        $response = $this->get('/');
        $response->assertStatus(200);
        $response->assertHeader('X-Inertia', 'true');

        $response->assertInertia(fn (AssertableInertia $page) => $page
            ->component('HomePage')
            ->has('sponsors.data', 5)
            ->has(
                'sponsors.data.0',
                fn (AssertableInertia $page) => $page
                    ->where('title', $sponsors[0]->title)
                    ->etc()
            ));
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:09:23