Как настроить заголовки запросов в спецификации запроса rspec?
В спецификации контроллера я могу настроить заголовок http accept следующим образом:
request.accept = "application/json"
но в спецификации запроса объект "запрос" равен нулю. Итак, как я могу это сделать здесь?
Причина, по которой я хочу установить заголовок http accept для json, заключается в том, что я могу это сделать:
get '/my/path'
вместо этого
get '/my/path.json'
Ответы
Ответ 1
Вы должны быть в состоянии указать заголовки 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"}
Ответ 2
Я использовал это в Test:: Unit:
@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index
Ответ 3
Это работает для спецификаций контроллера, а не для запроса спецификации:
request.headers["My Header"] = "something"
Ответ 4
Я добавляю это здесь, поскольку я сильно застрял, пытаясь сделать это в Rails 5.1.rc1
Теперь подпись метода get немного отличается.
Вам нужно указать параметры после пути как аргументы ключевого слова, т.е.
get /some/path, headers: {'ACCEPT' => 'application/json'}
FYI, полный набор аргументов ключевых слов:
params: {}, headers: {}, env: {}, xhr: false, as: :symbol
Ответ 5
Мне нужно настроить заголовки отдельно
request.headers["Accept"] = "application/json"
Попытка отправить его с помощью get/delete/.... - полный мусор в rails4 и причиняет боль в моей голове, потому что он никогда не отправляется как заголовок, а как параметр.
{"Accept" => "application/json"}
Ответ 6
Использование rspec с Rack::Test::Methods
header 'X_YOUR_HEADER_VAR', 'val'
get '/path'
Заголовок var будет проходить как X-Your-Header-Var
Ответ 7
Чтобы отправить оба xhr: true
и заголовки, мне нужно было сделать, например:
my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers
Ответ 8
С RSpec 3 вы можете использовать следующий синтаксис
get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }
Как описано в официальной документации Rspec (ссылка указывает на v3.7)
Ответ 9
Попробуйте что-то вроде:
get :index, :format => 'json'
Ответ 10
На ваш вопрос уже был дан ответ, но если вы хотите отправить POST другому действию, вы должны это сделать:
post :save, {format: :json, application: {param1: "test", param2: "test"}}