ruby-on-rails - rails - rspec and capybara
Las pruebas de Capybara fallan con Timeout:: Error en la primera prueba cuando se usa Google Maps (2)
¿Has intentado cambiar GemFile para tener un grupo: producción do?
¿Y estás cargando todo este script en el lugar correcto?
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false">
Este ejemplo es para 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>
Estoy probando con RSpec + Capybara + Selenium (Firefox). No importa qué subconjunto de mis pruebas de aceptación corro, el primero falla (las próximas pruebas funcionan correctamente) con "razón" como esta:
Failure/Error: visit ''/''
Timeout::Error:
Timeout::Error
Mi aplicación depende en gran medida de GoogleMaps y BackboneJS. Cuando realizo pruebas, la página no termina de cargarse y el mensaje "transferencia de datos de maps.googleapis.com" permanece en la esquina inferior izquierda de la ventana de Firefox; sin embargo, la página parece cargada correctamente (los mapas y otros contenidos están presentes). Ya he configurado el tiempo de espera en 60 segundos para excluir cualquier problema de red lento. Y todas las pruebas subsiguientes funcionan muy rápido (como las secuencias de comandos de Google correctas y ya almacenadas en la memoria caché). Además, cuando inicio el servidor en el entorno de desarrollo y accedo a él ( localhost:3000
) todo funciona bien.
Firefox 17.0.1. Algunas de mis gemas:
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)
¿Tiene alguna idea de por qué sucede esto y cómo prevenirlo?
EDITAR:
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:
Solía funcionar correctamente antes (hace unas semanas, este proyecto se detuvo durante ese tiempo). Podría ser introducido por la actualización de RSpec de 2.11 a 2.12 (que hice hace algunas semanas), pero he intentado degradarlo y ocurren las mismas cosas. Revertí toda la base de código al punto hace un mes para excluir una posible regresión de gemas. El problema aún sucede.
EDIT3:
Acabo de descubrir que si comento la línea responsable de adjuntar el mapa de Google:
new google.maps.Map($("#map")[0], mapOptions)
entonces todo funciona como un encanto.
EDIT4:
Código fuente de la aplicación de ejemplo: https://github.com/skalee/capybara-google-maps-failure
La ejecución de todas las especificaciones dará como resultado Timeout :: Error en la primera (al menos para mí). Sin embargo, todas las especificaciones pasarán cuando:
- Quita la línea que inicializa Geocoder (no se usa en la aplicación de ejemplo, pero la uso en la mía).
- Elimina la línea que inicializa el Mapa .
- Lo que más me sorprendió cuando proporcionó una hoja de estilo trivial, como nada más que eso:
#map{ width: 600px ; height: 600px }
Las gemas son exactamente las mismas gemas que uso en mi aplicación. Hay algunos scripts de terceros en /vendor/assets
.
No debe depender de servicios externos para sus pruebas. Aquí hay una estrategia:
http://robots.thoughtbot.com/post/34761570235/using-capybara-to-test-javascript-that-makes-http