Laravel 8 PHPUnit测试GET参数无法识别问题求助
问题原因
Laravel 测试框架发起的是模拟HTTP请求,不会主动填充$_GET、$_POST这类PHP原生超全局变量,所有请求参数只会保存在Laravel自身的Illuminate\Http\Request实例中。你在浏览器直接访问是真实HTTP请求,服务端软件会自动填充超全局变量,所以功能正常,单元测试环境下自然拿不到$_GET['num']的值。
解决方案
1. 修改控制器代码,使用Laravel官方推荐的方式获取请求参数
修改app\Http\Controllers\TimeController.php代码如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TimeController extends Controller { public function test(Request $request) { // query() 方法专门用于获取GET参数,第二个参数为默认值 return $request->query('num', 'Num not provided'); } }
2. 测试用例优化说明
你编写的三个测试用例中,num_test_2和num_test_3的写法完全符合Laravel的测试规范,修改控制器代码后这两个用例即可正常通过。
如果习惯手动拼接参数到URL,num_test_1的写法也可以正常运行,但更推荐通过get()方法的第二个参数传递参数,可读性和可维护性更高。
不建议在测试中手动给
$_GET赋值来兼容原控制器写法,Laravel对所有请求参数做了默认的安全过滤,直接用原生超全局获取参数会跳过过滤逻辑,增加安全风险。
内容的提问来源于stack exchange,提问作者Sam Jenkins
相关产品推荐
相关产品推荐

