2013-10-14 51 views
2

我目前正在運行一個循環,其中retry在我的測試中執行。我如何存根retry並仍然測試它上面的代碼?RSpec - 處理救援塊內的重試

我有一個片段趕上HostKeyMismatch例外:

rescue Net::SSH::HostKeyMismatch => e 
    e.remember_host! 
    retry 
end 

我的規格:

describe "rescues Net::SSH::HostKeyMismatch" do 
    it "resyncs the ssh keys" do 
    Net::SSH::HostKeyMismatch.any_instance.should_receive(:remember_host!).and_return(true) 
    ssh_class.new.run_ssh_command { raise Net::SSH::HostKeyMismatch } 
    end 
end 

錯誤我越來越:

The message 'remember_host!' was received by #<Net::SSH::HostKeyMismatch: Net::SSH::HostKeyMismatch> but has already been received by Net::SSH::HostKeyMismatch 

更新:

我能夠通過添加計數器下面的建議答案來解決問題:

describe "rescues Net::SSH::HostKeyMismatch" do 
    it "resyncs the ssh keys" do 
    exception = Net::SSH::HostKeyMismatch.new 
    exception.should_receive(:remember_host!).and_return(true) 
    count = 0 
    ssh_class.new.run_ssh_command do 
     count += 1 
     raise exception unless count > 1 
    end 
    end 
end 

回答

3

重試叫上你的run_ssh_command被稱爲對象。

所以

describe "rescues Net::SSH::HostKeyMismatch" do 
    it "resyncs the ssh keys" do 
    ssh_instance = ssh_class.new 

    Net::SSH::HostKeyMismatch.any_instance.should_receive(:remember_host!).and_return(true) 
    ssh_instance.should_receive(:retry) 

    ssh_instance.run_ssh_command { raise Net::SSH::HostKeyMismatch} 
    end 
end 
+0

我想你的答案一字不差,但最後一行似乎在無限循環 –

+0

@MusannifZahir運行:我已經更新我的答案。請嘗試使用 – usha

+0

由於run_ssh_command塊無條件地引發異常,所以出現同樣的問題。我能夠通過添加一個計數器來解決問題 - 問題已經通過最終解決方案進行了更新 –