it-roy-ru.com

Как установить заголовки запроса в спецификации запроса rspec?

В спецификации контроллера я могу установить заголовок http accept так:

request.accept = "application/json"

но в спецификации запроса, объект запроса равен нулю. Так как я могу сделать это здесь?

Причина, по которой я хочу установить http accept header на json, заключается в том, что я могу сделать это:

get '/my/path'

вместо этого

get '/my/path.json'
118
Sergey

Вы должны быть в состоянии указать заголовки 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"}
130
awaage

Я использовал это в Test :: Unit:

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

Для меня это работает просто request.headers["My Header"] = "something"

18
morgoth

Я добавляю это здесь, так как я застрял, пытаясь сделать это в Rails 5.1.rc1

Подпись метода get теперь немного отличается.

Вам необходимо указать параметры после пути в качестве аргументов ключевых слов, т.е.

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

К вашему сведению, полный набор ключевых слов аргументов:

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

13
Jules Copeland

Использование rspec с Rack::Test::Methods

header 'X_YOUR_HEADER_VAR', 'val'
get '/path'

Заголовок var будет выглядеть как X-Your-Header-Var

8
marcusb

Я должен установить заголовки отдельно

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

Попытка отправить его через get/delete/.... - полный мусор в Rails4 и вызывает боль в моей голове, потому что он никогда не отправляется как заголовок, а как параметр.

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

С RSpec 3 вы можете использовать следующий синтаксис

get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }

Как описано в официальной документации Rspec (ссылка указывает на v3.7)

4
Cyril Duchon-Doris

Чтобы отправить и xhr: true и заголовки, я должен был сделать, например:

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

Попробуйте что-то вроде:

get :index, :format => 'json' 
3
gayavat

На ваш вопрос уже был дан ответ, но в случае, если вы хотите POST что-то сделать для другого действия, вы должны сделать это:

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