2014-01-21 56 views
0

有沒有辦法重寫這個規範?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

假設訪問鏈結果橫跨期望不改變,則可以在一個常規的Ruby變量保存結果的it塊內,也可以按如下方式使用的RSpec的let記憶化助手(未測試):

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(...).to eq(...)模式本身的重複。

+0

謝謝你,這是一個解決方案,我希望有一點像http://myronmars.to/n/dev-blog/2014/01/new-in-rspec-3-composable-matchers一樣冷靜? utm_source = ruby​​weekly&utm_medium =電子郵件 – Calin

+0

謝謝_you_指向我的博客,我錯過了。我會讀它,看看我是否可以在這裏應用它,以便我可以分享你還不知道的東西。 ;-) –

+0

這將是驚心動魄的,謝謝_you_;) – Calin