链式方法的Rspec匹配

链式方法的Rspec匹配,rspec,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].eleme

有没有办法重写这个规范

      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.root
subject.root.elements

假设访问链的结果不会因预期而改变,您可以将结果保存在
it
块中的常规Ruby变量中,或者,您可以使用RSpec的
let
Memorization助手,如下所示(未测试):


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

谢谢,这是一个解决方案,我希望有一些更酷的东西,比如谢谢您给我指了指我错过的博客。我会阅读它,看看是否可以在这里应用它,这样我就可以分享一些你还不知道的东西
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