تجنب ملحقات المستوى المحمي وطرق المساواة في اختبار الياقوت

StackOverflow https://stackoverflow.com/questions/4010661

  •  25-09-2019
  •  | 
  •  

سؤال

لديّ بعض رمز Ruby الذي يستخدم المستوى المحمي ATTR_READERS لتكون قادرًا على تنفيذ طريقة == حتى نتمكن من تأكيد بعض التقويم الناتج عن التقويم المتوقع) ، لكن هذه الملحقات المحمية لن تكون هناك حاجة لأي رمز إلى جانب التأكيدات في الاختبار الشفرة.

بعض التعليمات البرمجية لدي مثل هذا:

class Calendar    
  def initialize(date_times)
    @date_times = date_times
  end

  def next_date_time
    @date_times.find { |time| time - DateTime.now > 0 }
  end

  def ==(other)
    @date_times == other.date_times
  end

  protected

  attr_reader :date_times
end

كيف يمكنني تجنب الحاجة إلى Attr_readers المحمية؟ في الواقع ، من الناحية المثالية ، سيكون من الرائع أن أتمكن من إزالة الحاجة إلى def==(...... كذلك ، لأنه مطلوب أيضًا فقط للاختبارات!

كل التوفيق ، أليكس

طعنة أولى في هذا:

module Kernel
  def subclass_with_equals(class_symbol)
    clazz = Kernel.const_get(class_symbol.to_s)
    Kernel.subclass_with_default_equals(clazz)
  end

  private

  def self.subclass_with_default_equals(base_class)
    sub_class = Class.new(base_class)
    sub_class.class_eval do
      def ==(other)
        instance_variables.all? { |v| self.instance_variable_get(v) == other.instance_variable_get(v) } and other.instance_of? self.class
      end
    end
    sub_class
  end
end

وفي الجزء العلوي من ملف المواصفات الخاص بي ، يمكنني إضافة هذا السطر لإضافة طريقة افتراضية == إلى صفي:

Calendar = sub_class_with_equals :Calendar

هذا يمكّنني من إزالة خمسة أو ستة أسطر من فصل التقويم الخاص بي!

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

المحلول

يمكنك قرد الفصل من داخل رمز الاختبار ، وفي هذه المرحلة يمكنك التخلص من مكالمة #Protected ().

قد يكون من الأفضل أن يكون ، من داخل رمز الاختبار ، إنشاء فئة فرعية من التقويم يحتوي على ملحق وطريقة ==.

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