تجنب ملحقات المستوى المحمي وطرق المساواة في اختبار الياقوت
سؤال
لديّ بعض رمز 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 ().
قد يكون من الأفضل أن يكون ، من داخل رمز الاختبار ، إنشاء فئة فرعية من التقويم يحتوي على ملحق وطريقة ==.