我有一个返回复杂对象的方法#get_something
。我想检查一下,这个复杂对象的特定公共属性是否等于字符串。
这就是我如何知道我可以测试这个:
require 'rspec/autorun'
class MySubject
ComplexObject = Struct.new(:type, :trustworthiness)
def get_something
ComplexObject.new('serious', 100)
end
end
RSpec.describe MySubject do
describe '#get_something' do
it 'returns an serious object' do
expect(subject.get_something.type).to eq('serious')
end
it 'returns an trustworthy object' do
expect(subject.get_something.trustworthiness).to be > 90
end
end
end
我想知道是否有一种方法可以这样写期望:
expect(subject.get_something).to have_attribute(:type).to eq('serious')
expect(subject.get_something).to have_attribute(:trustworthiness).to be > 90
这背后的原因是我想明确表示我对#get_something
的结果感兴趣,而不是对ComplexObject
实例感兴趣。
这个场景已经有匹配者了吗?如果没有,您将如何编写此规范,尤其是当您对正确设置了多个属性感兴趣时?
提前感谢
Matchers没有一个to
方法。它们采用单个expected
参数,并评估其真实性,因此您需要传递一个散列,如:
expect(subject.get_something).to have_attribute(method: :type, value: 'serious')
expect(subject.get_something).to have_attribute(method: :trustworthiness, value: ->(v) { v > 90 } )
具有解释CCD_ 6参数的明显复杂性
另一种方法是使用its
功能,它在RSpec 3中移动到一个单独的gem,如
RSpec.describe MySubject do
describe '#get_something' do
subject(:get_something) { MySubject.new.get_something }
its(:type) { should eq 'serious'}
its(:trustworthiness) { should be > 90 }
end
end