rspec 요청 사양에서 요청 헤더를 설정하는 방법은 무엇입니까?


127

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

request.accept = "application/json"

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

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"}
Matt Scilipoti

58
참고 : 이것은 rspec-rails 컨트롤러 테스트에서 아래 설명과 유사한 통합 테스트를위한 것입니다. request.env [ "HTTP_ACCEPT"] =
Alex Soto

5
내가 바보이기 때문에 내가 만난 작은 문제 : 헤더 키는 문자열이어야합니다. 기호가 표시되지 않습니다.
ajmurmann

@ajmurmann 이제 심볼이 작동합니다 : "Authorization"헤더가 될 수 있습니다 :authorization.
프랭클린 유

13
새로운 RSspec 3 구문은 get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Cyril Duchon-Doris

39

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

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

3
마찬가지로 rspec-rails 컨트롤러 테스트에서 Alex Soto가 다른 답변에 대한 주석에서 언급 한 것처럼 request.env [ "HTTP_ACCEPT"]
gerry3

고마워 친구, 오래된 2.3 앱에서 나를 위해 일한 유일한 사례ActionController::TestCase
ecoologic

+1 Cookie헤더 해시에 이름이 지정된 키를 사용하려고 시도했지만 (브라우저에서 전송하는 것이기 때문에) 작동하지 않습니다. 그런 다음 request.keys이라는 키를 보았습니다 HTTP_COOKIE. 그것을 사용하여 작동했습니다. 그들은 실제로 이것을 더 잘 문서화해야합니다.
Kelvin

실제로 작동한다! 또한에서 그 답을 찾을 github.com/rspec/rspec-rails/issues/65
스테판 자카 로프에게

@Sytse Sijbrandij 아무도 Test :: Unit에 대해 질문하지 않았습니다. rspec에 대한 질문입니다.
Bryan Dimas

18

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

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

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

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

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

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


18

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

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

2
나를 위해 일한이, 당신이 사용하는 경우 어떻게, 헤더를 검색하는에 따라 request.headers또는request.env
에드가 오르테가

3
참고 : 이것은 질문에 언급 된 통합 테스트가 아니라 컨트롤러 테스트를위한 것입니다.
Franklin Yu

3
통합 테스트에는 효과가 없었습니다. 그러나 컨트롤러 테스트와 함께 작동합니다.
Petr Gazarov

9

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

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

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

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

5
이것이 실제로 OP 질문에 대한 답변을 제공합니까? 새로운 질문이라면 새로운 질문을 여는 것이 좋습니다.
β.εηοιτ.βε

9

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

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

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


참고 : 이것은 Test::UnitRSpec이 아닌을위한 것입니다.
Franklin Yu

rspec 표시
James Tan

1
네. rspec에서는 ndefined method 'header'나에게 오류 가 발생합니다.
Евгений Масленков



2

귀하의 질문에 이미 답변되었지만 다른 작업에 무언가를 게시하려는 경우이 작업을 수행해야합니다.

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

2

다음과 같은 것을 시도하십시오 :

get :index, :format => 'json' 

확실하지는 않지만 레일이 해당 경로의 .format을 찾고 있기 때문에 작동합니다. 이것은 나에게도 일어났다.
Alan

2
누군가 궁금해 format=json하는 경우 쿼리 매개 변수로 추가 됩니다. 헤더 필드와 동일하지 않습니다.
Kevin Carmody
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.