Rspec匹配链式方法

时间:2014-01-21 12:26:53

标签: rspec

有没有办法重写这个规范?

      expect(subject.root.name).to eq('DEMDataSet')
      expect(subject.root.elements[0].name).to eq('dAgency.Group')
      expect(subject.root.elements[0].elements[0].name).to eq('dAgency.02')
      expect(subject.root.elements[0].elements[1].name).to eq('dAgency.01')

我认为可以避免重复subject.rootsubject.root.elements

1 个答案:

答案 0 :(得分:1)

假设访问链的结果并未随预期发生变化,您可以将结果保存在it块中的常规Ruby变量中,或者您可以使用RSpec的let memoization助手,如下所示(未经测试):

describe "..." do
  ...
  let(:root) { subject.root }
  let(:element0) { root.elements[0] }
  ....
  it "..." do
    ...
    expect(root.name).to eq('DEMDataSet')
    expect(element0.name).to eq('dAgency.Group')
    expect(element0.elements[0].name).to eq('dAgency.02')
    expect(element0.elements[1].name).to eq('dAgency.01')
    ...
  end
end

您可以通过定义一个采用整数并返回相关名称的方法来消除最后两个语句的expect参数中的剩余重复,但除非有更多这些,否则可能不会增加可读性。当然,如果您愿意,可以定义自己的方法来消除expect(...).to eq(...)模式本身的重复。