Конечная точка Laravel Testing API – отсутствуют параметры POST

У меня есть конечная точка API, которую я хочу протестировать, она получает полезную нагрузку POST. Конечная точка обычно вызывает библиотеку Omnipay Sage Pay для обработки уведомлений сервера.

Я могу отправить POST на эту конечную точку, используя клиент Postman, но при использовании теста Laravel phpunit, например.

$response = $this->post($url, $data);

Библиотека Omnipay не видит данные публикации?

Я думаю, это потому, что помощник Laravel $this->post не использует POST-запросы application/x-www-form-urlencoded? Я заглянул за кулисы в $this->post и, похоже, он напрямую вызывает контроллеры/методы, что имеет смысл.

Ближе всего к этой работе я подошёл к прямому использованию Guzzle (см. ниже), однако это направляет запрос за пределы сеанса «тестирования» и обратно в моё локальное приложение, как я предполагаю? Затем это ломает мои тесты, поскольку я настраиваю некоторые тестовые данные через фабрики перед вызовом POST.

$response = $client->request('POST', $url, ['form_params' => $data]);

Я не совсем уверен, в чем проблема, в моих тестах или в самой библиотеке Omnipay?


person Snaver    schedule 30.08.2019    source источник
comment
Если вы считаете, что это вызвано отсутствием заголовка типа контента application/x-www-form-urlencoded, вы можете попробовать добавить заголовок в запрос и посмотреть, решит ли это проблему.   -  person Severin    schedule 30.08.2019


Ответы (1)


Решено.. Оказывается, Omnipay позволяет вам передавать свой собственный класс/объект Request в качестве третьего параметра при вызове объекта Omnipay. После этого библиотека получит доступ к параметрам POST из тестового $this->post($url, $data); вызова.

Illuminate\Http\Request в Laravel является расширением 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);

        ...
    }

    ...
person Snaver    schedule 31.08.2019