我在編寫一個完整的堆棧驗收測試時遇到一些困難,這個測試涉及與較昂貴的網絡調用進行接口連接試圖避免。嘲諷驗收測試中的昂貴資源(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告訴我完成這種類型測試的常用方法是什麼?
我同意大部分你已經什麼說,除了我不認爲黃瓜應該打一個真正的外部服務器,至少不是大部分時間。但是WebMock和VCR絕對是這裏的重要工具。我寫的關於WebMock的[presentation](http://marnen.github.com/webmock-presentation/webmock.html)可能會引起人們的興趣。 –
@ MarnenLaibow-Koser好的presso。對於RSpec,是的絕對不應該外部。對於黃瓜,我認爲這取決於外部網絡服務的內容。再次,有些項目要求驗收測試儘可能「真實」。 –