Rspec-core: قم بتشغيل نفس المواصفات عدة مرات مع مرشحات مختلفة

تم إنشاؤها على ٨ أكتوبر ٢٠١١  ·  3تعليقات  ·  مصدر: rspec/rspec-core

_ إخلاء المسؤولية: ينبع هذا الطلب تحديدًا من إجراء اختبارات قبول JavaScript مع Capybara. على الرغم من أنني أستطيع رؤية حالات الاستخدام لمواقف أخرى.

تم ترميز جميع تطبيقاتي بحيث تعمل بشكل جيد مع إيقاف تشغيل JS ، ولكن مع تشغيل JS _ on_ ، تحصل على الكثير من الأجراس والصفارات اللطيفة لجعل تجربة المستخدم أكثر متعة. لهذا السبب ، من وجهة نظر المستخدم ، التفاعلات في معظم الأشياء متطابقة ؛ ومع ذلك ، أريد اختبار أنه يعمل على حد سواء w / و w / o JS.

ما أريده هو أن أكون قادرًا على القيام به هو تعيين نوع من العلم لإخبار RSpec بتشغيل نفس المواصفات مرتين مع كل مجموعة فلاتر. شيء مثل:

it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
    # stuff here
end

أعلم أنه يمكن تحقيق ذلك بأمثلة مشتركة ولكن الكود الناتج ليس أنيقًا للغاية.

يمكن استخدامه أيضًا إذا كنت تريد اختبار w / o JS (اختبار الحامل) w / JS على Firefox (السيلينيوم) و w / JS على Webkit (كابيبارا webkit) مثل هذا:

it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
    # stuff here
end

أتخيل أيضًا طريقة لاستخدام عوامل التصفية المخصصة لتحديد خيارات run_with لذا فهي ليست مطولة تمامًا مثل:

it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
    # stuff here
end

أفكار؟ لقد بحثت في المستندات والرمز ولم أجد طريقة للقيام بذلك حاليًا باستخدام المرشحات.

التعليق الأكثر فائدة

لم يتم تصميم المرشحات حقًا للقيام بذلك خارج الصندوق ، ولكن ليس من الصعب الحصول على السلوك الذي تطلبه دون إجراء تغييرات على RSpec:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

إذا كان هذا نمطًا شائعًا تحتاج إليه ، فيمكنك إنشاء طريقة DSL صغيرة له:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

ثم يمكنك استخدام هذه الطريقة على النحو التالي:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

أعتقد أن هذا أنيق للغاية. إن تغيير كيفية عمل المرشحات للقيام بما تطلبه سيكون تغييرًا مهمًا إلى حد ما من شأنه أن يضيف عبء صيانة مستقبليًا إلى فريق RSpec لميزة أتوقع أن يتم استخدامها نادرًا ، لذا فإن غريزتي هي عدم إضافة هذا إلى الأساسي .

ومع ذلك ، إذا كنت تريد إنشاء جوهرة rspec-multi-filters توفر هذه الوظيفة ، فلا تتردد :).

ال 3 كومينتر

لم يتم تصميم المرشحات حقًا للقيام بذلك خارج الصندوق ، ولكن ليس من الصعب الحصول على السلوك الذي تطلبه دون إجراء تغييرات على RSpec:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

إذا كان هذا نمطًا شائعًا تحتاج إليه ، فيمكنك إنشاء طريقة DSL صغيرة له:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

ثم يمكنك استخدام هذه الطريقة على النحو التالي:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

أعتقد أن هذا أنيق للغاية. إن تغيير كيفية عمل المرشحات للقيام بما تطلبه سيكون تغييرًا مهمًا إلى حد ما من شأنه أن يضيف عبء صيانة مستقبليًا إلى فريق RSpec لميزة أتوقع أن يتم استخدامها نادرًا ، لذا فإن غريزتي هي عدم إضافة هذا إلى الأساسي .

ومع ذلك ، إذا كنت تريد إنشاء جوهرة rspec-multi-filters توفر هذه الوظيفة ، فلا تتردد :).

myronmarston كالمعتاد ، كان مجرد جهلي لما يمكن أن تفعله RSpec. شكرا لأخذ الوقت والتوضيح. أعتقد أن هذا سيعمل بشكل جيد. :)

: +1: رائع

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات