[ruby-on-rails] rspec 요청 사양에서 요청 헤더를 설정하는 방법은 무엇입니까?

컨트롤러 사양에서 다음과 같이 http accept 헤더를 설정할 수 있습니다.

request.accept = "application/json"

그러나 요청 스펙에서 “요청”오브젝트는 nil입니다. 어떻게해야합니까?

http accept 헤더를 json으로 설정하려는 이유는 다음과 같습니다.

get '/my/path'

이 대신

get '/my/path.json'



답변

여기에 설명 된대로 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"}


답변

나는 이것을 Test :: Unit에서 사용했다 :

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


답변

Rails 5.1.rc1 에서이 작업을 주로 시도하면서이를 추가하고 있습니다.

get 메소드 서명이 약간 다릅니다.

경로 뒤에 옵션을 키워드 인수로 지정해야합니다. 즉

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

참고로 전체 키워드 인수는 다음과 같습니다.

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


답변

이것은 요청 사양이 아닌 컨트롤러 사양에 적용됩니다.

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


답변

헤더를 별도로 설정해야합니다

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

get / delete / ….를 통해 전송을 시도하면 rails4의 완전한 쓰레기이며 헤더로 보내지 않고 매개 변수로 보내지기 때문에 머리에 통증을 유발합니다.

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


답변

함께 rspec 사용 Rack::Test::Methods

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

헤더 var는 다음과 같이 나타납니다. X-Your-Header-Var


답변

RSpec 3에서는 다음 구문을 사용할 수 있습니다

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

공식 Rspec 문서에 설명 대로 (링크는 v3.7을 가리킴 )