سؤال

هل يعرف أي شخص كيفية جعل RSPEC يتبع إعادة التوجيه (في مواصفات وحدة تحكم)؟ (على سبيل المثال الاختبار/الوحدة قد تابع _redirect!)

لقد حاولت "follow_redirect!" و "follow_redirect" ولكن احصل فقط

undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>

فمثلا:
عندما أقوم بإنشاء حساب ، يتم إعادة توجيه الصفحة إلى صفحة الحسابات ويجب أن يكون حسابي الجديد في أعلى القائمة.

it "should create an account" do
  post :create, :name => "My New Account"
  FOLLOW_REDIRECT!
  response.code.should == "200"
  accounts = assigns[:accounts]
  accounts[0].name.should == "My New Account"
end

لكن اتبع_Redirect! يحتاج إلى تغيير إلى شيء يعمل بالفعل.

هل كانت مفيدة؟

المحلول

إذا كنت ترغب في اختبار إعادة التوجيه ، فأنت تتحرك خارج نطاق RSPEC-rails.

يمكنك استخدام Webrat أو بعض إطار اختبار التكامل الآخر لاختبار هذا.

أسهل طريقة لحل هذا دون اللجوء إلى اختبار التكامل هي ربما تسخر من الطريقة التي تسبب إعادة التوجيه.

نصائح أخرى

أعتقد أن هذا هو السلوك الافتراضي ل RSPEC-RAILS اختبارات وحدة التحكم ، بمعنى أنه يمكنك تعيين توقع على حالة الاستجابة و/أو المسار ، واختبار النجاح.

فمثلا:

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end

يمكنك الوصول إلى موقع إعادة التوجيه مع

response.headers['Location']

يمكنك بعد ذلك طلب ذلك مباشرة.

حاول استخدام اختبارات التكامل/الطلب. إنهم يستخدمون ACCES الشبيه بالويب من خلال التوجيه إلى وحدات التحكم. على سبيل المثال: لدي تطبيق Rails 2 في الملف /spec/integration/fps_spec.rb

 require 'spec_helper'

 describe "FinPoradci" do 

   it "POST /fps.html with params" do
     fp_params={:accord_id => "FP99998", :under_acc => "OM001", :first_name => "Pavel", :last_name => "Novy"}
     fp_test=FinPoradce.new(fp_params)
     #after create follow redirection to show
     post_via_redirect "/fps", {:fp => fp_params}
     response.response_code.should == 200 # => :found ,  not 302 :created
     new_fp=assigns(:fp)
     new_fp.should_not be_empty
     new_fp.errors.should be_empty
     flash[:error].should be_empty
     flash[:notice].should_not be_empty
     response.should render_template(:show)
   end
 end

ويعمل. حتى تريد إرسال الرؤوس (للحصول على إذن HTTP الأساسي).

 env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)}
 post_via_redirect "/fps", {:fp => fp_params}, env

من الجيد إنشاء ، ولكن بعد إعادة توجيهه يعود 401 ويحتاج إلى إذن جديد. لذلك لا بد لي من تقسيمه في اختبارين: الخلق والعرض على نتيجة الخلق.

المواصفات خارج نطاقها ، إذا كنت ترغب في اتباع مواصفات طلب استخدام إعادة التوجيه ، فإن ما يعادل اختبار التكامل في Test :: Unit.

في طلب المواصفات follow_redirect! يعمل وكذلك في الاختبار :: الوحدة.

أو إذا كنت ترغب في إعادة توجيه الاستخدام بشكل غير طبيعي _via_redirect كلاحقة للفعل ، مثال:

post_via_redirect :create, user: @user

لـ RSPEC / Capybara + Rails

response_headers['Location']

لكنه يعمل فقط إذا لم يكن هناك تأخير قبل إعادة التوجيه. إذا كان هناك ، فمن الصعب اتباع المنطق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top