Проблема с миграцией тестов Rspec-контроллеров с Rails 4.2.10 на Rails 5.1.4 - PullRequest
0 голосов
/ 20 сентября 2018

Старая Rails 4.2.10 строка:

post :show, "Some XML as String"

в Rails 5.1.4

post :show, params: { ??? }

Так что же здесь добавляется пара ключ-значение?

Редактировать: Так что в настоящее время в тестах написано так:

let(:logout_request_xml) { "<soap-env:Envelope xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'><soap-env:Body>...more stuff...</soap-env:Body></soap-env:Envelope>" }
...
post :show, logout_request_xml

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Я смог POST необработанные данные с помощью Rails 5.1.4, установив их непосредственно в запросе для спецификации контроллера

@request.env['RAW_POST_DATA'] = '<test>some raw xml</test>'
post :show

В контроллере это можно прочитать через request.body.read

> request.body.read
=> "<test>some raw xml</test>"

Обратите внимание, что это не будет работать при переходе на Rails 5.2.В этом случае тело запроса будет пустым, поскольку основное поведение изменилось.Лучший способ проверить этот сценарий - использовать спецификации запросов вместо спецификаций контроллера.

спецификации контроллера - спецификация контроллера представляет собой оболочку RSpec для функционального теста Rails.Он позволяет вам моделировать один http-запрос в каждом примере, а затем указывать ожидаемые результаты

Спецификации запроса - Спецификации запроса обеспечивают тонкую оболочку для интеграционных тестов Rails и предназначены для управления поведением через полный стек,включая маршрутизацию (предоставляемую Rails) и без заглушки (это зависит от вас).

Вот пример отправки этих же данных через спецификацию запроса:

post items_path, env: {'RAW_POST_DATA' => "<test>some raw xml</test>"}

В контроллере

> request.body.read
=> "<test>some raw xml</test>"
0 голосов
/ 11 декабря 2018

Ни один из приведенных выше ответов не работал для меня в Rails 5.2.2.

Я использовал код, подобный этому @request.env['RAW_POST_DATA'] = json в 5.1, в некоторых случаях, когда мне требовался специальный тип сериализации, и я преобразовывал всете, чтобы:

json = { "some" => "JSON" }.to_json
post :show, body: json
0 голосов
/ 20 сентября 2018

Вот как вы можете передать необработанное тело в мини-тесте:

post :show, as: :xml, headers: { 'RAW_POST_DATA': 'Some XML as String' }

Вы не можете использовать params, потому что это не предполагается использовать таким образом, такжевам нужно добавить as: :xml, потому что вы отправляете необработанное тело с application/x-www-form-urlencoded типом содержимого.

В контроллере request.raw_body

...