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抛出异常返回错误页而非正常响应。 - 临时打印响应内容定位问题
如果上面两步都没发现问题,在测试中临时打印响应头和响应内容,直接看实际返回的是什么:
如果返回的是HTML内容,大概率是中间件未生效、或者应用抛出了异常返回了错误页;如果返回的JSON里没有$response = $this->get('/'); dump($response->headers->all()); dump($response->getContent());component、props这几个Inertia必填字段,说明控制器返回格式错误。 - 清理缓存重新加载包依赖
执行以下命令清理测试环境可能存在的旧缓存:
避免旧的配置缓存、服务提供者缓存导致Inertia服务未正确加载。php artisan config:clear php artisan route:clear php artisan package:discover
调整后的可参考测试代码:
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
相关产品推荐
相关产品推荐

