Laravel Pest测试断言失败:404与200不匹配,求排查方案
问题说明
用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

