اختبار النظام من البداية للنهاية للثيمات ومكونات الثيم

<div> </div>

يعد كتابة اختبارات آلية للسمات جزءًا مهمًا من عملية تطوير السمات، حيث يمكن أن يساعد في ضمان استمرار عمل الميزات التي تقدمها السمة بشكل جيد مع مرور الوقت مع ميزات Discourse الأساسية.

تدعم Discourse حاليًا طريقتين لكتابة اختبارات الانحدار للسمات. الأولى تتبع بشكل أساسي طريقة EmberJS وتتضمن فقط اختبار كود جانب العميل. الطريقة الثانية هي كتابة اختبارات نظام Rails التي تسمح لك باختبار كود جانب الخادم وكود جانب العميل في نفس الوقت. ستركز هذه الوثيقة على كتابة اختبارات نظام Rails للسمات وهي ما نوصي به لمؤلفي السمات بالتركيز عليه عند كتابة اختبارات لسماتهم أيضًا.

اختبارات نظام Rails للسمات

في جوهرها، تستخدم Discourse أطر عمل الاختبار RSpec و Capybara لتشغيل اختبارات نظام Rails. يلزم وجود معرفة أساسية بـ RSpec و Capybara للبدء، ونوصي بقراءة الروابط التالية أولاً قبل البدء:

إرشادات ونصائح لكتابة اختبارات نظام السمات

هذه بعض الإرشادات التي يجب اتباعها عند كتابة اختبارات النظام:

  • يُتوقع أن تكون اختبارات النظام موجودة في الدليل spec/system في دليل السمة.

  • يُتوقع أن يتبع كل ملف في الدليل spec/system تنسيق _spec.rb<وصف_اختبار_النظام>.

  • يجب أن يحتوي كتلة RSpec describe ذات المستوى الأعلى على بيانات وصفية system: true. مثال:

    RSpec.describe "Testing A Theme or Theme Component", system: true do
      it "displays the component" do
        ...
      end
    end
    
  • تتوفر طرق مساعدة upload_theme و upload_theme_component ويجب استدعاؤها قبل تشغيل الاختبارات. مثال:

    RSpec.describe "Testing A Theme or Theme Component", system: true do
      let!(:theme) do
        upload_theme
      end
    
      # أو `upload_theme_component` إذا كانت السمة الخاصة بك مكونًا
      #
      # let!(:theme_component) do
      #   upload_theme_component
      # end
    
      it "displays the component" do
        ...
      end
    end
    
  • يمكن تغيير إعداد السمة في اختبار النظام عن طريق استدعاء طريقة update_setting على الكائن theme ثم حفظ السمة.

    مثال:

    RSpec.describe "Testing A Theme", system: true do
      let!(:theme) do
        upload_theme
      end
    
      it "does not display the theme when `should_render` theme setting is false" do
        theme.update_setting(:should_render, false)
        theme.save!
    
        expect(page).not_to have_css("#some-identifier")
      end
    end
    
  • تستخدم Discourse gem fabrication التي تسمح لنا بإعداد بيانات الاختبار التي نحتاجها لكل اختبار بسهولة. يمكن استخدام القائمة الكاملة للمصنعين المتوفرة في Discourse الأساسي في اختبار نظام السمة أيضًا.

    مثال:

    RSpec.describe "Testing A Theme", system: true do
      let!(:theme) do
        upload_theme
      end
    
      it "displays the theme" do
        user = Fabricate(:user)
        category = Fabricate(:category)
        topic = Fabricate(:topic)
        topic_2 = Fabricate(:topic, title: "This is topic number 2")
    
        ...
      end
    end
    
  • استخدم طريقة المساعدة sign_in للاختبار مقابل ملفات تعريف مستخدمين مختلفة.

    مثال:

    RSpec.describe "Testing A Theme", system: true do
      let!(:theme) do
        upload_theme
      end
    
      it "does not display the theme for a regular user" do
        user = Fabricate(:user)
        sign_in(user)
    
        ...
      end
    
      it "displays the theme for a staff user" do
        admin = Fabricate(:admin)
        sign_in(admin)
    
        ...
      end
    end
    
  • في بعض الأحيان سترغب في جعل الاستعلام عن أجزاء الصفحة وفحصها أسهل وقابلة لإعادة الاستخدام لاختبارات النظام الخاصة بك. للقيام بذلك، يمكنك استخدام مفهوم PageObjects، والذي ستراه غالبًا في الأساس.

    مثال:

    # frozen_string_literal: true
    
    module PageObjects
      module Components
        class MyCustomComponent < PageObjects::Components::Base
          COMPONENT_SELECTOR = ".my-custom-component"
    
          def click_action_button
            find("#{COMPONENT_SELECTOR} .action-button").click
          end
    
          def has_content?(content)
            has_css?("#{COMPONENT_SELECTOR} .content", text: content)
          end
        end
      end
    end
    

    ويمكنك بعد ذلك استخدامه عن طريق استيراده باستخدام require_relative المدمج في Ruby في أعلى ملف اختبار النظام الخاص بك.

    require_relative "page_objects/components/my_custom_component"
    

تشغيل اختبارات نظام السمات

يمكن تشغيل اختبارات نظام السمات باستخدام أداة discourse_theme CLI rubygem ويمكن تثبيتها باستخدام هذه التعليمات.

بمجرد تثبيت أداة discourse_theme CLI، يمكنك تشغيل جميع اختبارات النظام في دليل السمة الخاص بك عن طريق تشغيل الأمر التالي:

discourse_theme rspec .

في التشغيل الأول لأمر rspec لسمة جديدة، سيُطلب منك ما إذا كنت ترغب في تشغيل اختبارات النظام باستخدام بيئة تطوير Discourse محلية أو حاوية Docker التي ستوفر لك بيئة التطوير المعدة. ما لم تكن مطورًا متمرسًا في إضافات أو سمات Discourse، نوصي باختيار n وتشغيل الاختبارات باستخدام حاوية Docker نظرًا لأن كل شيء سيعمل مباشرة.

يدعم الأمر discourse_theme rspec أيضًا تشغيل دليل مواصفات واحد، أو ملف، أو ملف بأرقام أسطر.

discourse_theme rspec /path/to/theme/spec/system
discourse_theme rspec /path/to/theme/spec/system/my_system_spec.rb
discourse_theme rspec /path/to/theme/spec/system/my_system_spec.rb:12

وضع الرأس (Headful mode)

بشكل افتراضي، يتم تشغيل اختبارات نظام السمات باستخدام Google Chrome في الوضع بدون رأس (headless mode). هذا وضع لا يعرض فيه المتصفح أي شيء على الشاشة مما يسمح لعمليات تشغيل الاختبار بالانتهاء بشكل أسرع. ومع ذلك، غالبًا ما يكون من المفيد أن تكون قادرًا على رؤية ما يفعله اختبار النظام الذي كتبته عن طريق استخدام Google Chrome في وضع الرأس. يمكنك تمكين هذا الوضع عن طريق تمرير الخيار --headful إلى الأمر discourse_theme rspec.

discourse_theme rspec . --headful

سيقوم الأمر أعلاه بتشغيل اختبارات النظام في وضع الرأس حيث يمكن رؤية تشغيل الاختبارات بصريًا.

يمكنك أيضًا إيقاف تنفيذ الاختبار في حالة الاختبار الخاصة بك عن طريق استخدام طريقة المساعدة pause_test، مما يسمح لك بفحص الحالة الحالية للتطبيق في المتصفح.

مثال:

RSpec.describe "Testing A Theme", system: true do
  let!(:theme) do
    upload_theme
  end

  it "displays the theme" do
    visit("/")
    click("#some-button")
    pause_test
    # ...
  end
end

هذه الوثيقة تخضع للتحكم في الإصدار - اقترح تغييرات على github.

18 إعجابًا

لاحظت أنه في اختبارات المكونات عادةً، يتم استخدام let!(:theme) بدلاً من let!(:theme_component). على سبيل المثال، في هذا الاختبار:

ومع ذلك، يقترح الدليل استخدام let!(:theme_component) لمكونات الثيم:

هل هناك سبب لاستخدام theme_component كما هو موضح في هذا الدليل؟

إعجابَين (2)