【问题标题】:Checking complex results in rspec检查 rspec 中的复杂结果
【发布时间】:2014-04-30 08:28:42
【问题描述】:

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

是否已经有适用于这种情况的匹配器?如果不是,您将如何编写此规范,尤其是当您对正确设置多个属性感兴趣时?

提前致谢

【问题讨论】:

    标签: rspec matcher


    【解决方案1】:

    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 } )
    

    解释 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多