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

Laravel Pest测试断言失败:404与200不匹配,求排查方案

Pest PHP测试路由返回404的排查方案

问题说明

用Pest PHP测试Laravel应用时,不管是测试首页/还是登录页/login,都返回404错误,哪怕路由文件里确实有这两个路由。

测试代码:

it('can view home page', function () {
    $response = $this->get('/');

    expect($response->status())->toBe(200);
});

it('can view login page', function () {
    $response = $this->get('/login');

    expect($response->status())->toBe(200);
});

收到的错误提示:

Failed asserting that 404 is identical to 200.

现有配置

.env 文件

APP_NAME="My software name"
APP_ENV=local
APP_KEY=base64:abchdX+Hm/LYphNZIBx942SFZoJYzGUFGidCxQifqMw=
APP_DEBUG=true
APP_URL=http://localhost/mysoftware

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="local"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <!-- <env name="DB_CONNECTION" value="sqlite"/> -->
        <!-- <env name="DB_DATABASE" value=":memory:"/> -->
        <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>

已经尝试在phpunit.xml的<php>节点里添加<env name="APP_URL" value="http://localhost/mysoftware"/>,但问题没解决。路由配置截图:路由配置截图


排查步骤

试试下面这些方法一步步定位问题:

1. 确认测试环境加载了目标路由

在测试里加一段代码,打印所有注册的路由,看看/和/login是否存在:

it('checks registered routes', function () {
    $routes = collect(\Illuminate\Support\Facades\Route::getRoutes())->map(fn($route) => $route->uri());
    dd($routes->toArray());
});

如果输出里找不到这两个路由,说明路由没加载进来,需要检查:

  • 路由定义文件(比如routes/web.php)是否被Laravel正常加载
  • 有没有路由分组或中间件配置,导致路由未在测试环境注册

2. 清除配置和路由缓存

如果之前手动执行过缓存命令,测试环境可能用的是旧配置。执行以下命令清除缓存:

php artisan config:clear
php artisan route:clear

清除后重新运行测试。

3. 验证测试环境的APP_URL配置

虽然测试用的是相对路径,但可以输出当前配置确认是否正确:

it('verifies APP_URL', function () {
    dd(config('app.url'));
});

如果输出不是http://localhost/mysoftware,检查phpunit.xml中的<env name="APP_URL"/>是否正确添加到<php>节点内,是否被其他配置覆盖。

4. 检查路由是否被中间件拦截

如果路由使用了auth等中间件,未登录的请求会被重定向,若重定向目标异常可能返回404。可以临时关闭中间件测试:

it('tests home page without middleware', function () {
    $response = $this->withoutMiddleware()->get('/');
    expect($response->status())->toBe(200);
});

如果这个测试通过,说明是中间件导致的问题,需要在测试中提前登录用户,或调整路由的中间件配置。

5. 确认测试文件的位置和命名规范

Laravel的Feature测试需要放在tests/Feature目录下,文件名需以Test.php结尾(例如HomePageTest.php)。如果测试文件放在tests/Unit目录下,可能不会加载web路由,导致无法识别路径。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:32:02