我正在使用RSpec + Capybara + Selenium(Firefox)进行测试。无论我运行的验收测试的哪个子集,第一个失败(下一个测试都能正常工作),其中“reason”如下:
Failure/Error: visit '/'
Timeout::Error:
Timeout::Error
我的应用程序严重依赖于GoogleMaps和BackboneJS。当我运行测试时,页面无法加载并且“从maps.googleapis.com传输数据”消息保留在Firefox窗口的左下角,但是页面看起来像是正确加载的(地图和其他内容存在)。我已将超时设置为60秒,以排除任何慢速网络问题。并且所有后续测试都可以非常快速地工作(例如,已经提取了适当的Google脚本并且已经缓存)。此外,当我在开发环境中启动服务器并访问它(localhost:3000
)时,一切正常。
Firefox 17.0.1。我的一些宝石:
capybara (2.0.1)
database_cleaner (0.9.1)
mongoid (3.0.13)
rspec (2.12.0)
rspec-core (2.12.1)
rspec-expectations (2.12.0)
rspec-mocks (2.12.0)
rspec-rails (2.12.0)
selenium-webdriver (2.26.0)
你知道为什么会发生这种情况以及如何预防吗?
编辑:
spec/spec_helper.rb
:
# This file is copied to spec/ when you run 'rails generate rspec:install' ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun' # Requires supporting ruby files with custom matchers and macros, etc, # in spec/support/ and its subdirectories. Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} RSpec.configure do |config| config.include FactoryGirl::Syntax::Methods config.treat_symbols_as_metadata_keys_with_true_values = true config.infer_base_class_for_anonymous_controllers = false #config.order = "random" end
spec/features/features_spec_helper.rb
:
require_relative "../spec_helper" require 'capybara/rspec' Capybara.default_driver = :selenium Capybara.default_wait_time = 60
EDIT2:
它曾经在以前工作(几周前;这个项目暂停了)。 可以通过RSpec升级从2.11升级到2.12(我几周前做过),但我只是试图降级它并且确实发生了同样的事情。我已经将整个代码库恢复到了点月前排除可能的宝石回归。问题仍然存在。
EDIT3:
我刚刚发现,如果我注释掉负责从谷歌附加地图的行:
new google.maps.Map($("#map")[0], mapOptions)
然后一切都像魅力一样。
EDIT4:
示例应用程序的源代码:https://github.com/skalee/capybara-google-maps-failure
运行所有规格将导致第一个出现Timeout :: Error(至少对我而言)。但是,所有规格都将在以下时间通过:
#map{ width: 600px ; height: 600px }
宝石与我在我的应用中使用的宝石完全相同。 /vendor/assets
中有一些第三方脚本。
答案 0 :(得分:1)
您不应该依赖外部服务进行测试。这是一个策略:
http://robots.thoughtbot.com/post/34761570235/using-capybara-to-test-javascript-that-makes-http
答案 1 :(得分:0)
您是否尝试过改变GemFile来创建一个组:生产吗?
你在正确的地方加载这整个脚本吗?
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false">
此示例适用于bootstrap:
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&key=YOUR_API_KEY&sensor=SET_TO_TRUE_OR_FALSE"
type="text/javascript">
</script>