Bagaimana cara menyetel HTTP_REFERER saat menguji di Rails?

88

Saya mencoba menguji pengontrol dan saya mendapatkan kesalahan ini. Saya memahami kesalahan tersebut, tetapi tidak tahu cara memperbaikinya.

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

Tentukan dimana? Saya mencoba ini:

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

Namun mendapat error yang sama.

Tentukan dengan apa tepatnya? Saya kira URI tampilan yang saya inginkan untuk kembali ke:

'/sessions/new'

Itukah yang mereka maksud?


Oke, ternyata yang mereka maksud lakukan ini:

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

Dapatkah seseorang memberi tahu saya di mana itu didokumentasikan? Saya ingin membaca tentang konteks informasi itu.

Bagaimana jika domainnya bukan "localhost: 3000"? Bagaimana jika itu "localhost: 3001" atau semacamnya? Adakah cara untuk mengantisipasi hal itu?

Mengapa ini tidak berhasil:

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

Dokumen Rails secara khusus mengatakan begitulah cara Anda mengatur header.

Ethan
sumber

Jawaban:

92

Rekomendasi mereka diterjemahkan sebagai berikut:

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end
James A. Rosen
sumber
1
Anda bisa lolos hanya dengan menentukan jalur relatif, seperti dalam '/ sesi / baru'.
Martin Faartoft
Ini tidak bekerja untuk saya karena saya menggunakan https => 'on'. Apa yang harus dilakukan sekarang?
Robert Reiz
48

Jawaban yang diterima tidak berfungsi untuk pengujian integrasi karena @requestvariabel tidak ada.

Menurut RailsGuides , Anda dapat meneruskan header ke pembantu.

Rel <= 4:

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

Rel> = 5:

test "blah" do
  get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
  ...
end
Fotios
sumber
2
Terimakasih banyak. Saya mencari 1 jam untuk solusi. Pos Anda bekerja untuk saya!
Robert Reiz
9
Di Rails 5, tajuk ditentukan seperti: get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } source
golfadas
9

Menanggapi pertanyaan:

Mengapa ini tidak berhasil:

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

Itu tidak berfungsi karena dokumen Rails yang Anda tautkan ke dokumen kelas yang berbeda dari yang mungkin Anda gunakan.

Anda ditautkan ke ActionController::Integration:Session. Saya menduga Anda sedang menulis tes fungsional (jika Anda menggunakan Test :: Unit) atau tes pengontrol (jika Anda menggunakan Rspec). Apa pun itu, Anda mungkin menggunakan ActionController::TestCaseatau subkelasnya. Yang, pada gilirannya, termasuk modul ActionController::TestProcess.

ActionController::TestProcessmenyediakan getmetode dengan parameter berbeda dari getmetode yang disediakan oleh ActionController::Integration:Session. (Mengganggu, eh?) Tanda tangannya adalah ini:

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

Sayangnya, tidak ada parameter header. Tapi setidaknya pengaturan @request.env['HTTP_REFERER']berhasil.

rlkw1024
sumber
1

Di Rails3 saya mendapat kesalahan yang sama:
Untuk menghilangkan ini di controller yang sesuai disediakan penyelamatan untuk "redirect_to: back"

Contoh:redirect_to :back rescue redirect_to required_path

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

Dalam Rails 2.2.2, blok di atas tidak pernah menjalankan pengujian yang sebenarnya. Mengatakan itu

posting: buat, {: user => {: email => 'invalid @ abc'}}

garis tidak berjalan. Anda cukup menyingkirkan blok pengaturan dan penggunaan

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

sebagai gantinya. Dan itu harus mengatur pengarah


sumber
0

Solusi paling mudah untuk masalah di atas adalah membuat permintaan dengan header terkait. Rails secara otomatis akan membaca header ini.

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

Saat ini, saya menggunakan Rails 5.2.1, pendekatan saya untuk merujuk permintaan stub di dalam pengontrol adalah seperti di bawah ini:

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