2013-09-16 115 views
4

我正在使用rspec來系統測試設備。該設備是模塊化的,因此任何數量的子設備都可以連接到測試設備。有很多地方我想寫測試,它們將循環連接子設備,並在每個設備上運行相同的測試。rspec:如何在第一次失敗後繼續測試

基本上,這就是我想要做的事:

before(:all) 
    @tool = discover_sub_devices() 
    @tool.sub_devices.should == exp_sub_device_list 
end 

describe "some sub device tests" do 
    @tool.sub_devices.each do |dev| 
    it "should succeed at doing things" do 
     dev.do_thing.should == success 
    end 
    end 
end 

可惜,這是行不通的。我收到錯誤說@tool是n,並且在測試運行之前不包含類sub_devices。因此在before(:all)塊運行之前正在分析測試。

我可以使其工作的一種方法是將環路放在it塊內。像這樣:

這樣做的問題是,我真的想測試所有的子設備,即使第一個失敗。我想看看有多少個子設備出現故障的報告。這個代碼一旦失敗就會發生,並且不會測試其餘的代碼。

我意識到這可能不是rspec的正常使用情況,但如果我可以完成這項工作,它對於我們的測試情況會非常方便。

有什麼建議嗎?

回答

0

你面臨的問題是,雖然letbeforeit塊的屍體得到在以後執行的describe塊的身體得到立即執行。

假設你不需要每次都重新發現的設備,你可以重構你的代碼如下,消除before電話:

​​
+0

偉大的建議,但我似乎無法得到這個工作。 @tool似乎總是零。 – PICyourBrain

+0

我認爲問題在於它內部的@tool塊和外部塊的@tool沒有相同的範圍:( – PICyourBrain

+0

對不起,我忘了實例變量不適用於這種技術。 。 –

1

以下是編寫一些這方面的技術。

最好避免使用before :all。最好避免在實例之外製作對象。

describe "some sub device tests" do 

    let(:tool) { discover_sub_devices } 

    it "matches the sub device list" do 
    tool.sub_devices.should be == expected_sub_devices_list 
    end 

    it "succeeds with all sub-devices" do 
    failures = tool.sub_devices.reject{|d| d.do_thing == success} 

    # option 1 
    failures.should be_empty # will show just a yes/no result 

    # option 2 
    failures.size.should be == 0 # will show the number of failures 

    # option 3 
    failures.should be == [] # will display all sub-devices which fail 
    end 

end