2011-11-28 83 views
3

我正在測試方法如何處理302 HTTPError異常。我試圖存根一個方法調用,以提高一個程序,但它不停地抱怨說錯號碼參數錯誤(0 2)引發OpenURI :: HTTPError導致錯誤參數數量錯誤

代碼測試這一行:

document = Nokogiri.HTML open(source_url) 

,並在規範我掐滅它是這樣的:

subject.stub(:open).and_raise(OpenURI::HTTPError) 
subject.should_receive(:ended=).with(true) 
subject.update_from_remote 

我不認爲這是關係到Nokogiri.HTML()或Open-uri.open(),那麼,爲什麼會出現這種情況?

此外,我將如何嘗試使此HTTPError作爲302重定向錯誤?謝謝

回答

5

我發現OpenURI :: HTTPError的構造函數需要兩個參數。默認情況下,Rspec會調用錯誤類的新方法,但不帶參數,這會導致此錯誤。所以我需要通過傳遞所需的參數手動創建一個錯誤對象。

exception_io = mock('io') 
exception_io.stub_chain(:status,:[]).with(0).and_return('302')   
subject.stub(:open).with(anything).and_raise(OpenURI::HTTPError.new('',exception_io)) 
1

這是一個非常晚的答覆,但對於其他人誰可能會有所幫助:如果您在引入nokogiri一起使用FakeWeb寶石,你可以做這樣的測試,而無需得到如此投入與內部的代碼。您可以在測試中使用FakeWeb註冊URI,並告訴它返回的內容。例如:

FakeWeb.register_uri(:get, 'http://www.google.com', :status => ['404', 'Not Found']) 

您提供的URI參數需要與您的方法調用的URI相匹配。然後,FakeWeb將攔截該呼叫,並返回您提供的狀態。