Як встановити заголовки запитів у специфікації запитів rspec?


127

У специфікації контролера я можу встановити заголовка http accept так:

request.accept = "application/json"

але в специфікації запиту об'єкт "запит" дорівнює нулю. То як я можу це зробити тут?

Причиною, з якої я хочу встановити заголовку http accept на json, є те, що я можу це зробити:

get '/my/path'

замість цього

get '/my/path.json'

Відповіді:


130

Ви повинні мати можливість вказати заголовки HTTP як третій аргумент для вашого методу get (), як описано тут:

http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

і тут

http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html#method-i-process

Отже, ви можете спробувати щось подібне:

get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}

3
Нам потрібно було використовувати "HTTP_ACCEPT": get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Метт Счіліпоті

58
ПРИМІТКА. Це для тестування інтеграції, подібно до коментаря нижче, у тестах контролерів rspec-rails, ви б використовували: request.env ["HTTP_ACCEPT"] =
Alex Soto

5
Невеликий готч, на який я зіткнувся, бо я дурний: у заголовках повинні бути рядки. Символи не з’являться.
ajmurmann

@ajmurmann Тепер символи працюють: заголовок "Авторизація" може бути :authorization.
Франклін Ю

13
Новий синтаксис RSspec 3 виглядатиме як get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Кирило Дюшон-Доріс

39

Я використовував це в Test :: Unit:

@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index

3
Аналогічно, як зазначає Алекс Сото у коментарі до іншої відповіді, у тестах контролерів rspec-rails ви можете використовувати: request.env ["HTTP_ACCEPT"]
gerry3

дякую чувак, єдиний приклад, який працював для мене на старому додатку 2.3 зActionController::TestCase
ecoologic

+1 Я спробував скористатися ключем, названим Cookieу хеші заголовків (тому що це надсилає мій браузер), але це не вийшло. Потім я зробив request.keysі побачив ключ на ім'я HTTP_COOKIE. Використовуючи це працювало. Вони справді повинні це краще засвідчити.
Келвін

Це справді працює! Я також знайшов цю відповідь у github.com/rspec/rspec-rails/isissue/65
Степан Захаров

@Sytse Sijbrandij Ніхто не питав про Test :: Unit. Питання про rspec.
Брайан Дімас

18

Я додаю це тут, коли я в основному застряг, намагаючись це зробити в Rails 5.1.rc1

Підпис методу get зараз трохи відрізняється.

Необхідно вказати параметри після шляху як аргументи ключових слів, тобто

get /some/path, headers: {'ACCEPT' => 'application/json'}

FYI, повний набір аргументів ключових слів:

params: {}, headers: {}, env: {}, xhr: false, as: :symbol


18

Це працює для специфікацій контролера, а не вимагати специфікації:

request.headers["My Header"] = "something"

2
Це працювало для мене, це залежить від того, як ви отримуєте заголовки, якщо ви використовуєте request.headersабоrequest.env
Едгар Ортега,

3
Примітка. Це для тестів контролера, а не тестів інтеграції, зазначених у питанні.
Франклін Ю

3
не працювали на інтеграційні тести. Однак працює з тестами контролера.
Петро Газаров

9

Доводиться встановлювати заголовки окремо

request.headers["Accept"] = "application/json"

Спроба надіслати його через get / delete / .... - це повне сміття в рейках4 і завдає болю в моїй голові, оскільки воно ніколи не надсилається як заголовок, а як параметр.

{"Accept" => "application/json"}

5
Чи справді це дає відповідь на питання ОП? Якщо це нове питання, то краще відкрити нове запитання.
β.εηοιτ.βε



5

Щоб надсилати xhr: trueі заголовки, я повинен був зробити, наприклад:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers

1
Ось вихідний код на GitHub: github.com/rails/rails/blob/…
Карл Вільбур

Не повинно headers =бути my_headers =?
webaholik

Виправлено. Дякую @webaholik.
Джим Стюарт

2

На ваше запитання вже відповіли, але у випадку, якщо ви хочете поставити щось на іншу дію, ви повинні зробити це:

post :save, {format: :json, application: {param1: "test", param2: "test"}}

2

Спробуйте щось на кшталт:

get :index, :format => 'json' 

Не впевнений, але, ймовірно, працює, тому що рейки шукають .формат для цього маршруту; це трапилось і для мене.
Алан

2
Якщо хтось цікавиться, це просто додає format=jsonпараметр запиту. Не те саме, що поле заголовка.
Кевін Кармоді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.