Я бы написал собственный помощник RSpec, если вы хотите, чтобы он читался более четко и был бы только одной строкой. Предположим, у нас есть следующий класс, который мы хотим протестировать:
class MyObject
attr_accessor :first, :last, :phone
def initialize first = nil, last = nil, phone = nil
self.first = first
self.last = last
self.phone = phone
end
end
Мы могли бы написать следующее сопоставление:
RSpec::Matchers.define :have_value do |attribute, expected|
match do |obj|
obj.send(attribute) == expected
end
description do
"have value #{expected} for attribute #{attribute}"
end
end
Затем, чтобы написать тесты, мы могли бы сделать что-то вроде:
describe MyObject do
h = {:first => 'wes', :last => 'bailey', :phone => '111.111.1111'}
subject { MyObject.new h[:first], h[:last], h[:phone] }
h.each do |k,v|
it { should have_value k, v}
end
end
Если вы поместите все это в файл, вызовите matcher.rb и запустите его, то вы получите следующее:
> rspec -cfn matcher.rb
MyObject
should have value wes for attribute first
should have value bailey for attribute last
should have value 111.111.1111 for attribute phone
Finished in 0.00143 seconds
3 examples, 0 failures