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.
sumber
Jawaban yang diterima tidak berfungsi untuk pengujian integrasi karena
@request
variabel 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
sumber
get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" }
sourceMenanggapi pertanyaan:
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 menggunakanActionController::TestCase
atau subkelasnya. Yang, pada gilirannya, termasuk modulActionController::TestProcess
.ActionController::TestProcess
menyediakanget
metode dengan parameter berbeda dariget
metode yang disediakan olehActionController::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.sumber
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
sumber
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
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'}
sumber
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
sumber