2014-04-30 61 views
0

我有一個方法#get_something,它返回一個複雜的對象。我想檢查一下,如果這個複雜對象的特定公共屬性包含一個字符串。檢查rspec中的複雜結果

這就是我知道我可以測試:

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實例中。

這個場景是否已經有一個匹配器?如果不是,你會如何編寫這個規範,特別是當你有興趣不止一個屬性設置正確時?

在此先感謝

回答

0

匹配器沒有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 }) 

具有明顯的複雜性解釋value參數

另一種方法是使用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