3

我将Capybaraselenium AND/OR capybara -webkit驱动程序和 Webmock 一起用作存根框架。

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

当我更改为 capybara-webkit 驱动程序(muuuuch 更快)执行相同操作时,我收到 webmock 消息,我应该存根外部请求。

有人可以解释一下为什么两者之间有区别吗?

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

编辑:

WebMock 之类的工具很棒,但是在测试 JavaScript 时,它是一个单独的浏览器进程来加载页面,而不是您的 Ruby 测试进程。这意味着对构建服务器的请求不会通过 Net::HTTP;请求来自 Firefox 或 capybara-webkit,这些工具兴高采烈地不知道您尝试重新路由 HTTP 流量的微弱尝试

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

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

解决方案:

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

我尝试使用用于 JS/浏览器外部调用的 puffing-billy 进行模拟,但是这个与 Webmock 不能“很好地合作”。我也有 25 个用于支付系统的存根,已经用 Webmock 编写,所以我没有办法切换......

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

最后,我只是决定使用 :selenium 驱动程序继续运行这几个需要 ajax API 响应的测试,该驱动程序启动 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
4

1 回答 1

0

这些警告不是来自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
于 2017-02-03T17:11:23.583 回答