21

我正在使用 RSpec + Capybara + Selenium (Firefox) 进行测试。无论我运行验收测试的哪个子集,第一个测试都会失败(下一个测试可以正常工作),原因如下:

 Failure/Error: visit '/'
 Timeout::Error:
   Timeout::Error

我的应用程序严重依赖 GoogleMaps 和 BackboneJS。当我运行测试时,页面没有完成加载并且“从 maps.googleapis.com 传输数据”消息停留在 Firefox 窗口的左下角,但是页面看起来加载正确(存在地图和其他内容)。我已经将超时设置为 60 秒以排除任何慢速网络问题。并且所有后续测试都运行得非常快(例如正确的 Google 脚本已被提取并已被缓存)。此外,当我在开发环境中启动服务器并访问它时(localhost:3000)一切正常。

火狐 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

# 当你运行 'rails generate rspec:install' 时,这个文件被复制到 spec/
ENV["RAILS_ENV"] ||= '测试'
需要 File.expand_path("../../config/environment", __FILE__)
需要'rspec/rails'
需要'rspec/autorun'

# 需要支持带有自定义匹配器和宏等的 ruby​​ 文件,
# 在 spec/support/ 及其子目录中。
目录[Rails.root.join("spec/support/**/*.rb")].each {|f| 要求 f}

RSpec.configure 做 |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 = "随机"
结尾

spec/features/features_spec_helper.rb

require_relative "../spec_helper"

需要“水豚/rspec”

Capybara.default_driver = :硒
Capybara.default_wait_time = 60

编辑2:

它以前可以正常工作(几周前;该项目当时停止了)。 可以通过从 2.11 升级到 2.12 的 RSpec 引入(我在几周前做过),但我刚刚尝试降级它并且确实发生了同样的事情。 我已将整个代码库恢复到一个月前的时间点,以排除可能的 gem 回归。问题仍然存在。

编辑3:

我刚刚发现,如果我注释掉负责从 Google 附加地图的行:

new google.maps.Map($("#map")[0], mapOptions)

然后一切都像魅力一样。

编辑4:

示例应用源代码:https ://github.com/skalee/capybara-google-maps-failure

运行所有规范将导致第一个中出现 Timeout::Error (至少对我而言)。但是,在以下情况下,所有规范都将通过:

  1. 您删除了初始化 Geocoder的行(它没有在示例应用程序中使用,但我在我的应用程序中使用它)。
  2. 您删除初始化 Map 的行
  3. 最让我惊讶的是,当您提供琐碎的样式表时,仅此而已:
#map{ 宽度:600px ; 高度:600px }

宝石与我在应用程序中使用的宝石完全相同。中有一些 3rd 方脚本/vendor/assets

4

2 回答 2

1

您不应该依赖外部服务进行测试。这是一个策略:

http://robots.thoughtbot.com/post/34761570235/using-capybara-to-test-javascript-that-makes-http

于 2013-08-13T15:47:29.203 回答
0

您是否尝试过更改 GemFile 以拥有一个组 :production ?

您是否将整个脚本加载到正确的位置?

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false">

此示例用于引导程序:

<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>
于 2013-04-01T16:40:59.390 回答