我使用 Capybara 与 selenium 和/或 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; DR; keep:selenium并在需要对外部API进行ajax调用的测试中进行真正的调用
我尝试使用用于JS /浏览器外部调用的puffing-billy进行模拟,但是这个与Webmock没有“合作”。另外,我在Webmock上写了支付系统alredy的25个存根,所以我无法切换......
我也尝试过VRC这是一个记录框架,但这个也适用于你的应用程序调用(Ruby .NET库)
最后我决定继续运行这些需要ajax API响应的测试:selenium driver启动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
答案 0 :(得分: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