【问题标题】:vcr with capybara-webkit带有 capybara-webkit 的录像机
【发布时间】:2012-06-28 04:29:36
【问题描述】:

我正在使用 capybara-webkit 测试与第三方网站的集成(我需要 javascript)。

我想使用 vcr 记录集成测试期间发出的请求,但 capybara-webkit 不通过 net http,因此 vcr 无法记录它们。我将如何为 vcr 编写一个允许我记录请求的适配器?

【问题讨论】:

    标签: ruby capybara-webkit vcr


    【解决方案1】:

    我为 rspec+capybara 编写了一个小型 ruby​​ 库 (puffing-billy),它正是这样做的 - 它在您的浏览器和外部世界之间注入了一个代理,并允许您伪造对特定请求的响应。

    例子:

    describe 'fetching badges from stackoverflow API' do
      it 'should show a nice message when you have no badges' do
        # stub some JSONP
        proxy.stub('http://api.stackoverflow.com/1.1/users/1/badges',
                   :jsonp => { :badges => [] })
    
        visit '/my_badges'
        page.should have_content("You don't have any badges :(")
      end
    end
    

    【讨论】:

    • 哈,是啊,我看到你在vcr线程上提到了,看起来很感兴趣。
    【解决方案2】:

    不幸的是,VCR 与 capybara-webkit 非常不兼容。事实上,capybara webkit 使用的是 c 语言的 webkit。作为 VCR 基础的 Webmock 和 Fakeweb 只能用于 Ruby Web 请求。让两者一起工作可能是一项艰巨的任务。

    我已经通过两种方式解决了这个问题:

    第一个(hacky,但有效)是向仅包含在测试环境中的应用程序添加一个新的 javascript 文件。该文件将发出外部 Web 请求的 JS 类存根。除了这种方法的纯hackatude之外,它还要求每次添加或更改新请求时,您也必须更改存根。

    第二种方法是通过我自己的服务器路由所有外部请求,通过我的服务器有效地代理所有外部请求。这有一个巨大的缺点,即您必须对您想要消费的所有内容采取行动(您可以通过一些工作对其进行泛化)。它还受到这样一个事实的困扰,即完成请求的时间可能会增加一倍。但是,由于请求现在是由 Ruby 发出的,因此您可以尽情使用 VCR。

    在我的情况下,方法#2 对我来说更有利,因为我需要 ruby​​ 来操作数据,以便我可以保持我的 javascript 源不可知。然而,我成功地使用方法 #1 有一段时间了。

    【讨论】:

    • 您可以非常轻松地运行通用代理服务器。我在 Ruby 中找不到很多。如果你想坚持 Ruby 生态系统,我建议 mousehole
    • 对,你可以。由于我们看到这种方法带来的操作系统依赖性和配置噩梦,我们把它扔掉了。
    • 您在使用基于代理服务器的分析时遇到了哪些困难?只需更改运行 capybara-webkit 的机器上的代理设置?
    • 我们的流程涉及我们所有运行测试的开发机器以及持续集成服务器。换句话说,我们必须处理至少 8 台机器和 2 个操作系统的配置。我们把它扔掉是因为我们不想在我们的应用程序开发堆栈中添加(又一个)操作系统级别的依赖项,更具体地说,我们不想配置和维护它。有一些附带的原因,但这是它的症结所在。所以说我们有问题是不准确的,老实说,我们甚至从未尝试过。
    • FWIW,我一直在考虑构建一个 VCR 代理服务器。如果你想看这个,请评论github.com/myronmarston/vcr/issues/187
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多