【发布时间】:2012-06-28 04:29:36
【问题描述】:
我正在使用 capybara-webkit 测试与第三方网站的集成(我需要 javascript)。
我想使用 vcr 记录集成测试期间发出的请求,但 capybara-webkit 不通过 net http,因此 vcr 无法记录它们。我将如何为 vcr 编写一个允许我记录请求的适配器?
【问题讨论】:
标签: ruby capybara-webkit vcr
我正在使用 capybara-webkit 测试与第三方网站的集成(我需要 javascript)。
我想使用 vcr 记录集成测试期间发出的请求,但 capybara-webkit 不通过 net http,因此 vcr 无法记录它们。我将如何为 vcr 编写一个允许我记录请求的适配器?
【问题讨论】:
标签: ruby capybara-webkit vcr
我为 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 与 capybara-webkit 非常不兼容。事实上,capybara webkit 使用的是 c 语言的 webkit。作为 VCR 基础的 Webmock 和 Fakeweb 只能用于 Ruby Web 请求。让两者一起工作可能是一项艰巨的任务。
我已经通过两种方式解决了这个问题:
第一个(hacky,但有效)是向仅包含在测试环境中的应用程序添加一个新的 javascript 文件。该文件将发出外部 Web 请求的 JS 类存根。除了这种方法的纯hackatude之外,它还要求每次添加或更改新请求时,您也必须更改存根。
第二种方法是通过我自己的服务器路由所有外部请求,通过我的服务器有效地代理所有外部请求。这有一个巨大的缺点,即您必须对您想要消费的所有内容采取行动(您可以通过一些工作对其进行泛化)。它还受到这样一个事实的困扰,即完成请求的时间可能会增加一倍。但是,由于请求现在是由 Ruby 发出的,因此您可以尽情使用 VCR。
在我的情况下,方法#2 对我来说更有利,因为我需要 ruby 来操作数据,以便我可以保持我的 javascript 源不可知。然而,我成功地使用方法 #1 有一段时间了。
【讨论】: