vcr与capybara-webkit

ops*_*psb 14 ruby capybara-webkit vcr

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

我想使用vcr来记录在集成测试期间发出的请求,但是capybara-webkit不会覆盖net http,因此vcr无法记录它们.我如何为vcr编写一个适配器,以便记录所需的内容?

Dan*_*ans 15

不幸的是,VCR与capybara-webkit非常不兼容.事实上,capybara webkit正在使用webkit,它位于c.Webmock和Fakeweb是VCR的基础,只能用于Ruby Web请求.让两者协同工作可能是一项艰巨的任务.

我用两种方法解决了这个问题:

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

第二种方法是通过我自己的服务器路由所有外部请求,通过我的服务器有效地代理所有外部请求.这有一个巨大的缺点,你必须对你想要消费的所有东西采取行动(你可以将其泛化,有些工作).它还有一个事实,即它可以使请求完成的时间增加一倍.但是,由于Ruby现在提出请求,您可以使用VCR来实现它的全部荣耀.

在我的情况下,方法#2对我来说更有利,这要归功于我需要ruby来操纵数据,这样我才能保持我的javascript源不可知.然而,我成功地使用方法#1已经有一段时间了.

  • FWIW,我一直在考虑建立VCR代理服务器一段时间.如果你想看到这个,请评论https://github.com/myronmarston/vcr/issues/187. (4认同)

小智 10

我为rspec + capybara 编写了一个小红宝石库(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
Run Code Online (Sandbox Code Playgroud)