Rails에서 테스트 할 때 HTTP_REFERER를 어떻게 설정하나요?


87

컨트롤러를 테스트하려고하는데이 오류가 발생했습니다. 오류는 이해하지만 해결 방법을 모르겠습니다.

test: on CREATE to :user with completely invalid email should respond with 
  redirect
(UsersControllerTest):ActionController::RedirectBackError: 
  No HTTP_REFERER was set in the request to this action, 
  so redirect_to :back could not be called successfully. 
If this is a test, make sure to specify request.env["HTTP_REFERER"].

어디에 지정 하시겠습니까? 나는 이것을 시도했다 :

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
  { 'referer' => '/sessions/new' } }

그러나 같은 오류가 발생했습니다.

정확히 무엇으로 지정합니까? 다시 돌아가고 싶은 뷰의 URI를 추측합니다.

'/sessions/new'

그게 무슨 뜻입니까?


좋습니다, 그래서 그들은 이것을 의미하는 것으로 밝혀졌습니다.

setup do
  @request.env['HTTP_REFERER'] = 'http://localhost:3000/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }, {}
end

누군가 문서화 된 위치를 말해 줄 수 있습니까? 나는 그 정보의 맥락을 읽고 싶습니다.

도메인이 "localhost : 3000"이 아니면 어떻게합니까? "localhost : 3001"같은 경우에는 어떻게됩니까? 그것을 예상 할 수있는 방법이 있습니까?

이것이 작동하지 않는 이유 :

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
  { 'referer' => '/sessions/new' } }

Rails 문서는 구체적으로 헤더를 설정하는 방법 이라고 말합니다 .

답변:


90

그들의 추천은 다음과 같이 해석됩니다.

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end

1
'/ sessions / new'와 같이 상대 경로를 지정하는 것만으로도 벗어날 수 있습니다.
Martin Faartoft 2011 년

https => 'on'을 사용하고 있기 때문에 이것은 나를 위해 작동하지 않습니다. 이제 무엇을해야합니까?
Robert Reiz 2013-08-08

47

@request변수가 존재하지 않기 때문에 허용 된 답변은 통합 테스트에서 작동 하지 않습니다.

RailsGuides 에 따르면 헤더를 헬퍼에게 전달할 수 있습니다.

레일 <= 4 :

test "blah" do
  get root_path, {}, {'HTTP_REFERER' => 'http://foo.com'}
  ...
end

레일> = 5 :

test "blah" do
  get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
  ...
end

2
많은 감사합니다. 해결책을 찾기 위해 1 시간을 검색했습니다. 귀하의 게시물이 저에게 효과적입니다!
Robert Reiz 2013-08-08

9
Rails 5에서 헤더는 다음과 같이 지정됩니다. get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } source
golfadas 2016 년

9

질문에 대한 답변 :

이것이 작동하지 않는 이유 :

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
{ 'referer' => '/sessions/new' } }

링크 한 Rails 문서 가 아마도 사용중인 클래스와 다른 클래스 문서화 하기 때문에 작동하지 않습니다 .

에 연결했습니다 ActionController::Integration:Session. 기능 테스트 (Test :: Unit를 사용하는 경우) 또는 컨트롤러 테스트 (Rspec을 사용하는 경우)를 작성하고 있다고 생각합니다. 어느 쪽이든, 당신은 아마도 ActionController::TestCase또는 그 하위 클래스를 사용하고있을 것입니다 . 차례로 모듈 ActionController::TestProcess.

ActionController::TestProcess에서 제공하는 get메소드와 다른 매개 변수가있는 get메소드를 제공합니다 ActionController::Integration:Session. (성가신가요?) 메소드 서명은 다음과 같습니다.

 def get(action, parameters = nil, session = nil, flash = nil)

안타깝게도 headers 매개 변수가 없습니다. 그러나 적어도 설정 @request.env['HTTP_REFERER']은 작동합니다.


1

Rails3에서 동일한 오류가 발생했습니다.
해당 컨트롤러에서 "redirect_to : back"에 대한 구조를 제공하여이를 제거하려면

예 :redirect_to :back rescue redirect_to required_path


0
setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end

Rails 2.2.2에서 위 블록은 실제 테스트를 실행하지 않았습니다. 에 대해 말하는 것

post : create, {: user => {: email => 'invalid @ abc'}}

라인이 실행되지 않았습니다. 간단히 설정 블록을 제거하고 사용할 수 있습니다.

@request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
post :create, { :user => { :email => 'invalid@abc' } }

대신. 그리고 리퍼러를 설정해야합니다.


0

위의 문제에 대한 가장 직접적인 해결책은 관련 헤더로 요청하는 것입니다. Rails는이 헤더를 자동으로 읽습니다.

post '/your-custom-route', {}, {'HTTP_REFERER': 'http://www.your-allowed-domain.com'}

0

현재 Rails 5.2.1을 사용했는데 컨트롤러 내부의 스텁 요청 리퍼러에 대한 접근 방식은 다음과 같습니다.

let(:stub_referer) { some_path(some_param) }
before do
  request.headers.merge! referer: stub_referer
  get :some_action, format: :html
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.