laravel - Laravel 测试 API 端点 - 缺少 POST 参数
问题描述
我有一个要测试的 API 端点,它接收一个 POST 有效负载。端点基本上调用Omnipay Sage Pay库来处理服务器通知。
我可以使用 Postman 客户端很好地发布到这个端点,但是当使用 Laravel phpunit 测试时,例如
$response = $this->post($url, $data);
Omnipay 库看不到帖子数据?
我认为这是因为 Laravel 助手$this->post
不使用 application/x-www-form-urlencoded POST 请求?我看了一下幕后$this->post
,它似乎直接调用了控制器/方法,这是有道理的..
我最接近这项工作的是直接使用 Guzzle(见下文),但是这会将请求路由到“测试”会话之外并返回到我假设的本地应用程序中?这会破坏我的测试,因为我在 POST 调用之前通过工厂设置了一些测试数据。
$response = $client->request('POST', $url, ['form_params' => $data]);
我不太确定问题出在哪里,无论是在我的测试中还是在 Omnipay 库本身中?
解决方案
解决了。事实证明,在调用 Omnipay 对象时,Omnipay 允许您将自己的请求类/对象作为第三个参数传递。然后,库将可以访问测试$this->post($url, $data);
调用中的 POST 参数。
LaravelIlluminate\Http\Request
是 的扩展Symfony\Component\HttpFoundation\Request
,所以我们可以直接通过它。
<?php
use Illuminate\Http\Request;
class SagePayController extends Controller
{
protected $gateway;
protected function setupGateway(Request $request)
{
$this->gateway = OmniPay::create('SagePay\Server', null, $request);
...
}
...
推荐阅读
- css - 如何删除反应中显示的 onClick 组件边框?
- reactjs - 如何使用 React 从 Mongodb 格式化日期
- python-3.x - 使用正则表达式计算每个字符串的出现次数
- google-kubernetes-engine - GKE 跳跃指标,向上和向下扩展
- android - ffmpeg 规模过滤器耗时太长
- sas - 识别变量中最频繁的数和最频繁的最大数 (SAS)
- brightness - Halcon - 如何处理不同颜色的物体
- ios - SWIFT:使用变量从单个函数导航到 UIViewControllers
- javascript - 网页包:未找到
- automation - iOS 模拟器上的空手道正在抛出 com.intuit.karate - java.net.SocketTimeoutException:读取超时