Ответ 1
Вы не должны зависеть от внешних сервисов для своих тестов. Вот стратегия:
http://robots.thoughtbot.com/post/34761570235/using-capybara-to-test-javascript-that-makes-http
Я тестирую RSpec + Capybara + Selenium (Firefox). Независимо от того, какой поднабор моих приемочных тестов я запускаю, первый из них терпит неудачу (следующие тесты работают правильно) с "причиной" следующим образом:
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)
У вас есть идея, почему это происходит и как его предотвратить?
EDIT:
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:
Я только что обнаружил, что если я прокомментирую строку, отвечающую за привязку карты от Google:
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
есть сторонние скрипты.
Вы не должны зависеть от внешних сервисов для своих тестов. Вот стратегия:
http://robots.thoughtbot.com/post/34761570235/using-capybara-to-test-javascript-that-makes-http
Вы пытались изменить GemFile вокруг, чтобы создать группу: производство?
И вы загружаете весь этот script в нужное место?
<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>