【问题标题】:Mocking an expensive resource in acceptance tests (rspec, cucumber)在验收测试中模拟昂贵的资源(rspec,黄瓜)
【发布时间】:2011-12-13 06:26:15
【问题描述】:

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

我正在使用 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 在注入的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' 之类的事情,然后使用假货,否则使用真货。这是rails环境中常用的成语还是太俗气?

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

想法、想法、意见、建议????任何有经验的 Rails 开发者都可以。和或 Cucumber/Rspec 大师告诉我完成此类测试的常用方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby rspec cucumber acceptance-testing


    【解决方案1】:

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

    否则,您可以使用 webmock 来存根 web 服务而不修改您的代码 - 因为您似乎知道 web 服务的输入和输出

    http://rubygems.org/gems/webmock

    VCR gem - 也使用 webmock - 可用于“记录”和保存 HTTP 响应,这样您就只需要访问一次 web 服务

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

    【讨论】:

    • 我同意你所说的大部分内容,除了我认为 Cucumber 不应该访问真正的外部服务器,至少大多数时候不会。但是 WebMock 和 VCR 绝对是这里必不可少的工具。我写的关于 WebMock 的 presentation 可能很有趣。
    • @MarnenLaibow-Koser 好出版社。对于 RSpec,yes 绝对不应该去外部。对于黄瓜,恕我直言,我认为这在很大程度上取决于外部网络服务是什么。再说一次,有些项目要求验收测试尽可能“真实”。
    猜你喜欢
    • 2011-02-06
    • 2010-11-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多