Как настроить заголовки запросов в спецификации запроса 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"}}