2013-06-22 46 views
0

我試圖根據塊的性能更新對象上的實例變量@status。該塊也會調用另一個類。存根異常,但正常評估(RSpec)

def run 
    @entries.keep_if { |i| valid_entry?(i) }.each do |e| 
    begin 
     unique_id = get_uniqueid e 
     cdr_record = Cdr.find_by_uniqueid(unique_id).first 
     recording = cdr_record.nil? ? NullAsteriskRecording.new : AsteriskRecording.new(cdr_record, e) 
     recording.set_attributes 
     recording.import 
    rescue Exception => e 
     fail_status 
    end 
    end 
end 

fail_status是更新實例變量:failed的私有方法。通過打破一些其他的事情,我已經基本驗證了這個代碼的作品,但我也想要一個測試。目前,我有以下內容:

context "in which an exception is thrown" do 
    before do 
    @recording = double("asterisk_recording") 
    @recording.stub(:import).and_raise("error") 
    end 

    it "should set #status to :failed" do 
    # pending "Update instance variable in rescue block(s) of #run" 
    subject.run 
    subject.status.should eq :failed 
    end 
end 

但是測試總是失敗。 rescue塊永遠不會被評估(我使用puts語句進行檢查,當在raise語句中對硬編碼進行評估時,將對其進行評估)。我使用double功能錯了嗎?或者我正在通過剔除異常來完成自己,因此rescue塊永遠不會運行?

回答

0

您在before塊中設置了@recording,但您爲run方法發佈的代碼不會使用@recording實例,因此在run方法中調用recording.import不會引發異常。

在您的運行方法中,記錄最終可能是NullAsteriskRecording或AsteriskRecording的實例。如果你知道這將是一個AsteriskRecording作爲當前的測試意味着,一個辦法是你的前框更改爲以下:

before do 
    AsteriskRecording.any_instance.stub(:import).and_raise("error") 
end 
+0

我的運氣,這將是簡單的。謝謝!解釋很棒。 –