我有点陷入困境,关于如何编写完整的堆栈验收测试,涉及与我试图避免的昂贵网络呼叫接口的较低层.
我正在使用rspec和黄瓜,并使用rspeck模拟进行大部分模拟.
以下是我正在做的一个人为的例子来说明我正在测试的内容.
你有一个页面添加成分,你可以用它来构建食谱和什么不是.在成功创建新成分后,成分模型命中网络服务以获取关于给定食物项目的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调用get_response_xml注入的on fake-webservice.
对于模型而言,它只是精细和花花公子,但在验收测试中情况更复杂.我想为测试"创建新成分"页面(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'
Run Code Online (Sandbox Code Playgroud)
除了详细的上下文之外,这是一个问题:在确保在流程中不调用实际Web服务的同时,编写此类验收测试的最佳方法是什么.
每个请求的服务费用和我测试很多,因此"你应该真正测试集成/验收测试中的所有交互"在这种情况下对我来说是不够的.
我需要找到一种方法来确保使用虚假的web服务或类似的东西而不是测试环境中的实际web服务(甚至可能是开发?).来自.Net背景,我习惯听到的典型答案是"使用依赖注入!!?!!".虽然我认为DI有它的优点(请不要把它变成DI辩论),但我认为这里有一个更简单的轻量级解决方案.
虽然我做了一些事情,If ENV["RAILS_ENV"] == 'test'然后使用假的,否则使用真实的.这是铁轨环境中常用的习惯用法还是太俗气了?
有没有办法将此注册为某种类型的提供程序,可以配置为'spec_helper.rb'块或黄瓜功能/支持/ env.rb块?
思想,想法,意见,建议???? 任何体验Rails开发者都可以.和/或Cucumber/Rspec大师告诉我完成这种测试的常用方法是什么?