14

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

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

4

2 回答 2

15

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

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

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

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

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

于 2012-06-26T19:57:15.333 回答
10

我已经为 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
于 2012-10-15T14:31:08.647 回答