Rails'de test ederken HTTP_REFERER'ı nasıl ayarlayabilirim?


88

Bir denetleyiciyi test etmeye çalışıyorum ve bu hatayı aldım. Hatayı anlıyorum ama nasıl düzelteceğimi bilmiyorum.

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

Nerede belirtin? Bunu denedim:

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

Ama aynı hatayı aldım.

Tam olarak ne ile belirtin? Sanırım geri dönmesini istediğim görünümün URI'si:

'/sessions/new'

Demek istedikleri bu mu?


Tamam, yani şunu yapmak istedikleri anlaşılıyor:

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

Biri bana bunun nerede belgelendiğini söyleyebilir mi? Bu bilginin bağlamını okumak istiyorum.

Alan adı "localhost: 3000" değilse ne olur? Ya "localhost: 3001" veya başka bir şeyse? Bunu tahmin etmenin bir yolu var mı?

Bu neden çalışmıyor:

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

Rails belgeleri özellikle başlıkları nasıl ayarladığınızı söylüyor .

Yanıtlar:


92

Önerileri şu şekilde tercüme edilir:

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

1
'/ sessions / new' gibi, sadece göreli yolu belirtmekle kurtulabilirsiniz.
Martin Faartoft

Bu benim için çalışmıyor çünkü https => 'on' kullanıyorum. Şimdi ne yapmalı?
Robert Reiz

48

Kabul edilen yanıt entegrasyon testleri için işe yaramaz çünkü @request değişken mevcut olmadığı .

RailsGuides'e göre , başlıkları yardımcılara iletebilirsiniz.

Raylar <= 4:

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

Raylar> = 5:

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

2
Çok teşekkürler. Çözüm için 1 saat aradım. Gönderiniz benim için çalışıyor!
Robert Reiz

9
Rails 5'te, başlıklar şu şekilde belirtilir: get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } kaynak
golfadas

9

Soruya yanıt olarak:

Bu neden çalışmıyor:

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

Muhtemelen kullandığınızdan farklı bir sınıftaki belgelere bağladığınız Rails belgesi çalışmaz .

İle bağlantı kurdunuz ActionController::Integration:Session. Tahminimce bir işlevsel test (Test :: Unit kullanıyorsanız) veya bir kontrolör testi (Rspec kullanıyorsanız) yazıyorsunuz. Her iki durumda da, muhtemelen kullanıyorsunuz ActionController::TestCaseveya onun bir alt sınıfı. Bu da modülü içerir ActionController::TestProcess.

ActionController::TestProcesstarafından sağlanan yöntemden getfarklı parametrelere sahip bir yöntem sağlar . (Can sıkıcı, ha?) Yöntem imzası şu:getActionController::Integration:Session

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

Ne yazık ki, başlık parametresi yok. Ama en azından ayar @request.env['HTTP_REFERER']işe yarıyor.


1

Rails3'te aynı hatayı aldım:
Karşılık gelen denetleyicide bundan kurtulmak için "redirect_to: back" için kurtarma sağlandı

Örnek: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'de, yukarıdaki blok hiçbir zaman gerçek testi çalıştırmadı. Bunu söylüyorum

yayın: oluştur, {: user => {: e-posta => 'geçersiz @ abc'}}

hat çalışmadı. Kurulum bloğundan kurtulabilir ve

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

yerine. Ve yönlendireni ayarlamalıdır


0

Yukarıdaki sorunun en basit çözümü, ilgili başlıklar ile istekte bulunmaktır. Rails bu başlığı otomatik olarak okuyacaktır.

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

0

Şu anda, Rails 5.2.1'i kullandım, denetleyici içindeki istek yönlendiricisine ilişkin yaklaşımım aşağıdaki gibidir:

let(:stub_referer) { some_path(some_param) }
before do
  request.headers.merge! referer: stub_referer
  get :some_action, format: :html
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.