RSPEC - Rails - كيفية متابعة إعادة التوجيه
-
30-09-2019 - |
سؤال
هل يعرف أي شخص كيفية جعل 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']
لكنه يعمل فقط إذا لم يكن هناك تأخير قبل إعادة التوجيه. إذا كان هناك ، فمن الصعب اتباع المنطق.