存根谷歌地方称硒与水豚网络套件



我正在使用带有硒和/或水豚网络套件驱动程序和Webmock的Capybara作为存根框架。

当我使用 selenium(火狐)对谷歌地图(地点)自动完成输入运行集成测试时,浏览器会对谷歌进行一些真正的调用,并接收带有地点组件的 JSON。

当我更改为水豚-webkit 驱动程序(muuuuch 更快)来做同样的事情时,我会收到 webmock 消息,我应该存根外部请求。

有人可以解释一下为什么两者之间存在差异吗?

注意:我设置了WebMock.disable_net_connect!( :allow_localhost => true )以允许调用本地服务器...

编辑:

像 WebMock 这样的工具很棒,但在测试 JavaScript 时,它是一个 加载页面而不是 Ruby 测试的单独浏览器进程 过程。这意味着对构建服务器的请求不会发出 通过网络::HTTP;请求来自火狐或 水豚网络套件,那些工具兴高采烈地不知道你的软弱 尝试重新路由 HTTP 流量

引自 http://robots.thoughtbot.com/using-capybara-to-test-javascript-that-makes-http

这就解释了为什么对支付系统的一些调用(在Rails控制器中完成)需要存根,为什么ajax不需要,但它没有解释为什么Firefox到达Google和webkit要求存根

溶液:

TL;DR; 保留 :selenium 并在需要对外部 API 进行 ajax 调用的测试中进行真正的调用

我尝试使用用于 JS/浏览器外部调用的 puffing-billy 进行嘲笑,但这个与 Webmock "合作不好"。此外,我有 25 个用 Webmock 编写的支付系统 alredy 存根,所以我无法切换......

我也尝试了VRC,它是记录框架,但这个也适用于您的应用程序(Ruby NET库)进行的调用

最后,我只是决定继续运行这几个需要ajax API响应的测试:selenium驱动程序,它启动Firefox并真正调用gMaps。

#spec_helper
...
WebMock.disable_net_connect!( :allow_localhost => true )   # Ask to stub all requests except to localhost
...
# Use headless capybara-webkit that is way faster!
Capybara.javascript_driver = :webkit
config.before(:each, js: true) do
   ...
end
# And when you need :selenium and firefox mark the spec with :force_selenium => true
config.before(:each, force_selenium: true) do
   Capybara.current_driver = :selenium
end

这些警告不是来自webmock,而是来自capybara-webkit本身,它希望您显式声明访问主机的行为,如下所示:

Capybara::Webkit.configure do |config|                                      
   config.allow_url("fonts.googleapis.com")
   config.allow_url("www.sandbox.paypal.com")
   config.allow_url("altfarm.mediaplex.com")
end

最新更新