Ruby on rails 在验收测试中模拟昂贵的资源(rspec、Cumber)

Ruby on rails 在验收测试中模拟昂贵的资源(rspec、Cumber),ruby-on-rails,ruby,rspec,cucumber,acceptance-testing,Ruby On Rails,Ruby,Rspec,Cucumber,Acceptance Testing,我对如何编写一个完整的堆栈验收测试感到有点困惑,该测试涉及到在较低级别上与我试图避免的昂贵网络调用进行接口 我正在使用rspec和cucumber,并使用rspeck mock进行大部分模拟 下面是一个人为的例子,说明了我正在测试的内容 你有一个添加配料的页面,你以后可以用它来制作食谱。成功创建新配料后,配料模型点击web服务获取美国农业部关于给定食品的营养信息,并将其存储在配料模型中 我编写了一个WebServiceInterface类,负责获取食物的名称,通过webservice发出适当的请

我对如何编写一个完整的堆栈验收测试感到有点困惑,该测试涉及到在较低级别上与我试图避免的昂贵网络调用进行接口

我正在使用rspec和cucumber,并使用rspeck mock进行大部分模拟

下面是一个人为的例子,说明了我正在测试的内容

你有一个添加配料的页面,你以后可以用它来制作食谱。成功创建新配料后,配料模型点击web服务获取美国农业部关于给定食品的营养信息,并将其存储在配料模型中

我编写了一个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\u response\u xml
由响应解析器在内部调用。在本例中,ResponseParser在注入的
假Web服务上调用
get\u response\u xml

对于模型来说,它运行得很好,但在验收测试中情况更为复杂。我想为页面编写一个验收测试,测试“创建新成分”页面(
new\u component\u path
)和成分索引路径(该路径列出了所有成分及其营养信息)(
components\u 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的争论),但我认为这里有一个更简单的轻量级解决方案

我曾经想过做一些类似于
的事情,如果ENV[“RAILS_ENV”]==“test”
那么就使用假的,否则就使用真的。这是rails环境中常用的习惯用法还是太俗气了

有没有办法将其注册为某种类型的提供程序,可以在“spec_helper.rb”块或cucumber features/support/env.rb块中进行配置


想法、想法、意见、建议????Rails开发人员和/或Cucumber/Rspec专家的经验能告诉我完成这类测试的常用方法吗?

对于Cucumber这样的验收测试,我更愿意实际操作系统的所有部分。有问题的Web服务的测试服务器吗?大多数好的web服务都应该有一个

否则,您可以使用
webmock
在不修改代码的情况下删除Web服务,因为您似乎知道Web服务的输入和输出

VCR
gem——它也使用webmock——可以用来“记录”和保存HTTP响应,这样您只需点击一次web服务


我同意你所说的大部分,只是我认为Cucumber不应该攻击真正的外部服务器,至少在大多数情况下不应该。但是WebMock和VCR绝对是这里的基本工具。我写的关于WebMock的文章可能会引起兴趣。@MarnenLaibow Koser Good presso。对于RSpec来说,是的,绝对不应该外挂。对于Cumber,imho,我认为这在很大程度上取决于外部web服务是什么。此外,一些项目要求验收测试尽可能“真实”。