检查rspec中的复杂结果

时间:2014-04-30 08:28:42

标签: rspec matcher

我有一个方法#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实例的结果。

这种情况是否已有匹配器?如果没有,您将如何编写此规范,特别是当您感兴趣的是正确设置了多个属性时?

提前致谢

1 个答案:

答案 0 :(得分: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