Como faço para definir HTTP_REFERER ao testar no Rails?

87

Estou tentando testar um controlador e recebo este erro. Eu entendo o erro, mas não sei como corrigi-lo.

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"].

Especifique onde? Eu tentei isso:

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

Mas obteve o mesmo erro.

Especificá-lo com o quê, exatamente? Acho que o URI da visualização para a qual desejo voltar:

'/sessions/new'

É isso que eles querem dizer?


OK, então parece que eles querem dizer fazer isto:

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

Alguém pode me dizer onde isso está documentado? Eu gostaria de ler sobre o contexto dessa informação.

E se o domínio não for "localhost: 3000"? E se for "localhost: 3001" ou algo assim? Alguma maneira de antecipar isso?

Por que isso não funciona:

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

Os documentos do Rails dizem especificamente que é assim que você define os cabeçalhos.

Ethan
fonte

Respostas:

90

Sua recomendação se traduz no seguinte:

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end
James A. Rosen
fonte
1
você pode escapar apenas especificando o caminho relativo, como em '/ sessões / novo'.
Martin Faartoft
Isso não está funcionando para mim porque estou usando https => 'on'. O que fazer agora?
Robert Reiz
47

A resposta aceita não funciona para testes de integração porque a @requestvariável não existe.

De acordo com RailsGuides , você pode passar cabeçalhos para os ajudantes.

Trilhos <= 4:

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

Trilhos> = 5:

test "blah" do
  get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
  ...
end
Fotios
fonte
2
Muito Obrigado. Procurei uma solução por 1 hora. Sua postagem funciona para mim!
Robert Reiz
9
No Rails 5, os cabeçalhos são especificados como: get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } fonte
golfadas
9

Em resposta à pergunta:

Por que isso não funciona:

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

Não funciona porque o documento Rails que você vinculou a documentos uma classe diferente daquela que você provavelmente está usando.

Você vinculou a ActionController::Integration:Session. Suponho que você esteja escrevendo um teste funcional (se estiver usando Test :: Unit) ou um teste de controlador (se estiver usando Rspec). De qualquer forma, você provavelmente está usando ActionController::TestCaseou uma subclasse dele. Que, por sua vez, inclui o módulo ActionController::TestProcess.

ActionController::TestProcessfornece um getmétodo com parâmetros diferentes do getmétodo fornecido por ActionController::Integration:Session. (Irritante, hein?) A assinatura do método é esta:

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

Infelizmente, não há parâmetro de cabeçalhos. Mas pelo menos a configuração @request.env['HTTP_REFERER']funciona.

rlkw1024
fonte
1

Em Rails3 eu obtive o mesmo erro:
Para me livrar disso no controlador correspondente fornecido resgate para "redirect_to: back"

Exemplo:redirect_to :back rescue redirect_to required_path

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

No Rails 2.2.2, o bloco acima nunca executou o teste real. Dizendo isso

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

linha não funcionou. Você pode simplesmente se livrar do bloco de configuração e usar

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

em vez de. E deve definir o referer


fonte
0

A solução mais direta para o problema acima é fazer a solicitação com os cabeçalhos associados. O Rails lerá automaticamente este cabeçalho.

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

Atualmente, eu usei o Rails 5.2.1, minha abordagem para stub request referer dentro do controlador é como abaixo:

let(:stub_referer) { some_path(some_param) }
before do
  request.headers.merge! referer: stub_referer
  get :some_action, format: :html
end
Agung Prasetyo
fonte