2011-12-13 53 views
2

我在編寫一個完整的堆棧驗收測試時遇到一些困難,這個測試涉及與較昂貴的網絡調用進行接口連接試圖避免。嘲諷驗收測試中的昂貴資源(rspec,黃瓜)

我使用rspec和黃瓜,並做大部分我的嘲笑rspeck嘲笑。

以下是我正在做的事情的例子,以說明我正在測試的內容。

你有一個添加成分的頁面,您可以稍後創建食譜和什麼不成功。成功創建新配料後,配料模型會打到Web服務,以獲取有關給定食品的usda營養信息並將其存儲在配料模型中。

我已經寫了一個WebServiceInterface類,負責獲取食品的名稱,通過webservice發出適當的請求並返回xml響應。然後,另一個輔助類將解析xml響應,然後返回當前在成分實例中使用的營養信息的集合。

現在,我已經編寫了一套超越WebServiceInterface的單元測試。它看起來是這樣的


fake-webservice = double('WebserviceInterface') 
fake-webservice.should_receive(:get_response_xml).with(ingredient).and_return(fake_xml_response) 

result = ResponseParser.new(fake-webservice).get_ingredient_nutritional_info 
result.calories.should eql(123) 
result.saturated_fat.should eql(10) 
 

注意get_response_xml由響應分析器內部調用。在這種情況下,ResponseParser在注入的fake-webservice上調用get_response_xml

對於模型來說,它的工作非常好,而且花哨,但在驗收測試中情況更復雜。我想爲測試「創建新成分」頁面(new_ingredient_path)與列出所有成分及其營養信息的成分索引路徑(ingredients_path)之間的集成的頁面編寫驗收測試。

驗收測試看起來是這樣的:

visit new_ingredient_path 
fill_in 'ingredient_name' :with => 'pickled herring' 
click_button 'Create ingredient' 
visit ingredients_path 
page.should have_content 'Pickled Herring 123 calories 10g saturated fat' 

放牧背景不談,這是一個問題:什麼是同時保證實際的Web服務不叫寫這種類型的驗收測試的最佳途徑該過程。

每個請求的服務費用和我測試了很多,所以「你應該真的在一個集成/驗收測試中測試所有的交互」在這種情況下不足以滿足我的需求。

我需要找到一種方法來確保在測試環境中使用假的Web服務或類似的東西,而不是實際的Web服務(甚至可能是開發?)。來自.Net背景,我習慣聽到的典型答案是「使用依賴注入!!?!!」。雖然我認爲DI有其優點(請不要把它變成DI辯論),但我認爲這裏有一個更簡單的輕量級解決方案。

我雖然做了像If ENV["RAILS_ENV"] == 'test'之類的東西,然後使用假的,否則使用真正的。這是鐵軌環境中常用的慣用語,還是太俗氣?

是否有某種方式可以將此註冊爲某種類型的提供程序,可以在「spec_helper.rb」塊或黃瓜features/support/env.rb塊中進行配置?

想法,想法,輸入,建議????任何人都可以體驗Rails開發。或者Cucumber/Rspec guru告訴我完成這種類型測試的常用方法是什麼?

回答

6

對於像黃瓜這樣的驗收測試,我寧願真正實際操作系統的所有部分。有問題的Web服務的測試服務器?大多數良好的Web服務應該有一個。

否則,您可以使用webmock到存根出的web服務,而無需修改代碼 - 因爲你似乎知道web服務

http://rubygems.org/gems/webmock

VCR寶石的輸入和輸出 - 它採用webmock太 - 可以用來「記錄」,然後保存HTTP響應,所以你只打了web服務一旦過

https://www.relishapp.com/myronmarston/vcr

+0

我同意大部分你已經什麼說,除了我不認爲黃瓜應該打一個真正的外部服務器,至少不是大部分時間。但是WebMock和VCR絕對是這裏的重要工具。我寫的關於WebMock的[presentation](http://marnen.github.com/webmock-presentation/webmock.html)可能會引起人們的興趣。 –

+0

@ MarnenLaibow-Koser好的presso。對於RSpec,是的絕對不應該外部。對於黃瓜,我認爲這取決於外部網絡服務的內容。再次,有些項目要求驗收測試儘可能「真實」。 –