对于如何编写完整的堆栈验收测试,我有点困惑,该测试涉及与我试图避免的昂贵网络调用的较低级别接口。
我正在使用 rspec 和 cucumber,并使用 rspeck 模拟进行大部分模拟。
以下是我正在做的一个人为的示例,以说明我正在测试的上下文。
您有一个用于添加成分的页面,您以后可以使用该页面构建食谱等等。成功创建新成分后,成分模型会访问 Web 服务以获取有关给定食品的 usda 营养信息并将其存储在成分模型中。
我编写了一个 WebServiceInterface 类,它负责获取食物的名称,通过 web 服务发出适当的请求并返回 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
注入的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'
除了冗长的上下文之外,这是一个问题:编写这种类型的验收测试的最佳方法是什么,同时确保在此过程中不调用实际的 Web 服务。
服务按请求收费,我进行了很多测试,所以“你真的应该在集成/验收测试中测试所有交互”在这种情况下对我来说是不够的。
我需要找到一种方法来确保在测试环境(甚至可能是开发?)中使用虚假的 web 服务或类似的东西而不是实际的 web 服务。来自.Net 背景,我习惯听到的典型答案是“使用依赖注入!!?!!”。虽然我认为 DI 有它的优点(请不要把这变成 DI 辩论),我只是认为这里有一个更简单的轻量级解决方案。
我虽然做过类似的事情,If ENV["RAILS_ENV"] == 'test'
然后使用假货,否则使用真实的。这是rails环境中常用的成语还是太俗气?
有没有办法将其注册为某种类型的提供者,可以在“spec_helper.rb”块或黄瓜特性/支持/env.rb 块中配置?
想法,想法,意见,建议????任何有经验的 Rails 开发者都可以。或者 Cucumber/Rspec 大师告诉我完成此类测试的常用方法是什么?