Laravel应用中如何测试采用自定义HTTP方法(如SEARCH)的路由端点
Laravel 8 自定义HTTP方法路由测试实现方案
原生无额外依赖的测试方式
Laravel 测试基类内置的get()、post()等快捷请求方法,本质都是对通用call()方法的封装,即使框架没有提供search()这类对应自定义HTTP方法的快捷调用,也不需要引入额外组件即可完成测试。
直接通过call()方法显式传入自定义HTTP方法,即可正常匹配对应路由:
public function testSomething() { // 参数顺序:HTTP请求方法, 请求URI, 路由参数, 请求参数, 上传文件数组, 服务端头参数数组 $this->call('SEARCH', '/something')->assertOk(); }
如果测试需要携带请求体、自定义请求头,用法和常规请求完全一致,例如携带JSON格式的查询参数:
public function testSearchWithPayload() { $this->call( 'SEARCH', '/something', [], ['keyword' => 'laravel 测试用例'], [], ['CONTENT_TYPE' => 'application/json'] )->assertOk(); }
可选优化:封装风格统一的快捷测试方法
如果项目内存在大量SEARCH接口的测试用例,可以在全局基础测试类tests/TestCase.php中封装和内置方法风格一致的快捷调用,减少重复代码:
// 写入 tests/TestCase.php 的类内部 protected function search(string $uri, array $data = [], array $headers = []) { return $this->call('SEARCH', $uri, [], $data, [], $headers); }
封装完成后,测试用例就可以直接使用和内置方法写法完全一致的代码:
public function testSearchInterface() { $this->search('/something', ['keyword' => 'test'])->assertOk(); }
注意事项:不要通过请求头重写(如
X-HTTP-Method-Override)伪装HTTP方法,Laravel路由匹配是基于请求行原生方法完成的,这类伪装头无法触发自定义方法的路由匹配逻辑。
内容的提问来源于stack exchange,提问作者jfhr
相关产品推荐
相关产品推荐

