سؤال

لنفترض الموقف التالي

class A
    attr_accessor :name
    def initialize(name)
        @name = name
    end
end

subject { A.new('John') }

ثم أرغب في الحصول على بعض مثل هذا

it { should have(:name) eq('John') }

هل من الممكن بطريقة ما؟

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

المحلول 2

نعم ، هذا ممكن ، لكن بناء الجملة الذي تريد استخدامه (باستخدام المساحات في كل مكان) يحتوي على ضمان have(:name) و eq('John') هل كل الوسيطات مطبقة على الطريقة should. لذلك يجب أن تضطر إلى تحديدها مسبقًا ، والتي لا يمكن أن تكون هدفك. ومع ذلك ، يمكنك استخدام RSPEC المخصصات المخصصة لتحقيق هدف مماثل:

require 'rspec/expectations'

RSpec::Matchers.define :have do |meth, expected|
  match do |actual|
    actual.send(meth) == expected
  end
end

هذا يمنحك بناء الجملة التالي:

it { should have(:name, 'John') }

أيضا ، يمكنك استخدام its

its(:name){ should eq('John') }

نصائح أخرى

طريقة انها تمت إزالة من RSPEC https://gist.github.com/myronmarston/4503509. بدلاً من ذلك ، يجب أن تكون قادرًا على القيام بطبع واحد بهذه الطريقة:

it { is_expected.to have_attributes(name: 'John') }
person = Person.new('Jim', 32)

expect(person).to have_attributes(name: 'Jim', age: 32)

المرجعي: RSPEC Have-Attributes Matcher

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