কারাগারে পরীক্ষার সময় আমি কীভাবে HTTP_REFERER সেট করব?


88

আমি একটি নিয়ামক পরীক্ষা করার চেষ্টা করছি এবং আমি এই ত্রুটি পেয়েছি। আমি ত্রুটিটি বুঝতে পারি, তবে কীভাবে এটি ঠিক করতে হয় তা জানি না।

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' } }

তবে একই ত্রুটি পেয়েছি।

ঠিক কি দিয়ে এটি নির্দিষ্ট করুন? আমি দেখতে পেয়েছি এর ইউআরআই আমি এটিতে ফিরে যেতে চাই:

'/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' } }

রেল ডক্সটি সুনির্দিষ্টভাবে বলেছে যে আপনি কীভাবে শিরোনাম সেট করেন।

উত্তর:


92

তাদের সুপারিশ নিম্নলিখিত অনুবাদ করে:

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

4
আপনি '/ সেশন / নতুন' এর মতো কেবল আপেক্ষিক পথ নির্দিষ্ট করেই পালিয়ে যেতে পারেন।
মার্টিন ফ্যারাফটফট

এটি আমার পক্ষে কাজ করছে না কারণ আমি https => 'চালু' ব্যবহার করছি। এখন কি করতে হবে?
রবার্ট রেইজ

48

গৃহীত উত্তর ইন্টিগ্রেশন পরীক্ষার জন্য কাজ করে না কারণ @requestভেরিয়েবলের অস্তিত্ব নেই।

রেলগুইডস অনুসারে , আপনি সাহায্যকারীদের কাছে শিরোনাম পাঠাতে পারেন।

রেল <= 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

4
অনেক ধন্যবাদ. আমি একটি সমাধানের জন্য 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। আমি অনুমান করছি যে আপনি একটি কার্যকরী পরীক্ষা লিখছেন (যদি আপনি টেস্ট :: ইউনিট ব্যবহার করছেন) বা একটি নিয়ামক পরীক্ষা (যদি আপনি আরএসপেক ব্যবহার করছেন)। যে কোনও উপায়ে আপনি সম্ভবত ব্যবহার করছেন 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

রেইল 3-তে আমি একই ত্রুটি পেয়েছি:
সম্পর্কিত কন্ট্রোলারে এ থেকে মুক্তি পাওয়ার জন্য "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

২.২.২ কারাগারে, উপরের ব্লকটি কখনই আসল পরীক্ষা চালায় না। যে বলার অপেক্ষা রাখে না

পোস্ট: তৈরি করুন, {: ব্যবহারকারী => {: ইমেল => 'অবৈধ @ 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.