रेलों में परीक्षण करते समय मैं 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

क्या कोई मुझे बता सकता है कि इसका दस्तावेज कहां है? मैं उस जानकारी के संदर्भ में पढ़ना चाहूंगा।

क्या होगा यदि डोमेन "लोकलहोस्ट: 3000" नहीं है? क्या होगा अगर यह "लोकलहोस्ट: 3001" या कुछ और है? प्रत्याशित करने का कोई तरीका?

यह काम क्यों नहीं करता है:

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

रेल डॉक्स विशेष रूप से कहते हैं कि आप हेडर कैसे सेट करते हैं।

जवाबों:


90

उनकी सिफारिश निम्नलिखित में अनुवाद करती है:

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

1
आप सापेक्ष पथ को निर्दिष्ट करने से दूर हो सकते हैं, जैसा कि '/ सत्र / नया' में है।
मार्टिन फ़ार्टॉफ्ट

यह मेरे लिए काम नहीं कर रहा है क्योंकि मैं https => 'on' का उपयोग कर रहा हूं। अब क्या करे?
रॉबर्ट रीज़

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 घंटा खोजा। आपकी पोस्ट मेरे लिए काम करती है!
रॉबर्ट रीज़

9
रेल 5 पर, हेडर निर्दिष्ट किए जाते हैं जैसे: get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } स्रोत
गोलाईदास

9

प्रश्न के उत्तर में:

यह काम क्यों नहीं करता है:

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

यह काम नहीं करता है क्योंकि रेल आपके द्वारा उपयोग किए जा रहे एक से भिन्न वर्ग के दस्तावेज़ों से जुड़ी हुई है

से जुड़ा हुआ है ActionController::Integration:Session। मैं अनुमान लगा रहा हूं कि आप एक कार्यात्मक परीक्षण लिख रहे हैं (यदि आप टेस्ट :: यूनिट का उपयोग कर रहे हैं) या एक नियंत्रक परीक्षण (यदि आप Rspec का उपयोग कर रहे हैं)। किसी भी तरह से, आप शायद उपयोग कर रहे हैं ActionController::TestCaseया इसके उपवर्ग का उपयोग कर रहे हैं । जो, बदले में, मॉड्यूल को शामिल करता है ActionController::TestProcess

ActionController::TestProcessद्वारा प्रदान की गई विधि की getतुलना में विभिन्न मापदंडों के साथ एक विधि प्रदान करता getहै ActionController::Integration:Session। (कष्टप्रद, एह?) विधि हस्ताक्षर यह है:

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

अफसोस की बात है कि कोई हेडर पैरामीटर नहीं है। लेकिन कम से कम सेटिंग @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

रेल 2.2.2 में, उपरोक्त ब्लॉक ने वास्तविक परीक्षण कभी नहीं किया। कहते हुए की

पोस्ट: बनाएं, {: उपयोगकर्ता => {: ईमेल => 'अमान्य @ abc'}}

लाइन नहीं चली। आप बस सेटअप ब्लॉक और उपयोग से छुटकारा पा सकते हैं

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

बजाय। और इसे रेफ़र सेट करना चाहिए


0

उपरोक्त समस्या का सबसे सीधा समाधान संबंधित हेडर के साथ अनुरोध करना है। रेल इस शीर्षक को स्वचालित रूप से पढ़ेगी।

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

0

वर्तमान में, मैंने रेल्स 5.2.1 का उपयोग किया है, नियंत्रक के अंदर अनुरोध अनुरोधकर्ता को स्टब करने का मेरा तरीका नीचे दिया गया है:

let(:stub_referer) { some_path(some_param) }
before do
  request.headers.merge! referer: stub_referer
  get :some_action, format: :html
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.