Почему спецификации функций RSpec с использованием Capybara, Poltergeist и Javascript постоянно терпят неудачу?

Привет коллеги-разработчики программного обеспечения,

У меня есть приложение Rails с обычным набором тестов (RSpec, Capybara, Poltergeist, jQuery, Rails). Я использую небольшой Javascript (jQuery) для удаленных запросов. В основном это работает, и я еще не понимаю свою проблему. Поэтому я могу обновить вопрос с дополнительными знаниями.

Может быть, вы могли бы дать мне несколько советов, что нужно исследовать, прежде чем я опубликую много не относящегося к делу кода и конфигурации.

Непоследовательное и неожиданное поведение находится в спецификации функции, которая проверяет с помощью полтергейста в Capybara, что взаимодействие с пользователем (щелчок по формам и ссылкам) скрывает и показывает HTML-элементы через AJAX с jQuery.

Показалось, что он даже работает корректно, если я тестирую вручную. Установка времени ожидания Capybara по умолчанию изменила только время ожидания запуска спецификации =). Я еще не нашел другой соответствующей конфигурации или использования.

Поэтому любая помощь/идея очень ценится. Заранее спасибо.

Мой spec_helper:

require 'simplecov'
require 'rubygems'

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'email_spec'
require 'rspec/autorun'
require 'rspec/rails'
require 'capybara/rspec'
require 'capybara/poltergeist'
require 'capybara/rails'

Capybara.javascript_driver = :poltergeist

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.include(EmailSpec::Helpers)
  config.include(EmailSpec::Matchers)
  config.include Capybara::DSL
  #config.include Capybara::RSpecMatchers
  config.mock_with :rspec

  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  # set to false with Capybara + Database Cleaner
  # set to true with ActiveRecord::Base patch from Jose Valim and without Database Cleaner
  config.use_transactional_fixtures = false
  config.infer_base_class_for_anonymous_controllers = true
  config.order = "random"
  config.include FactoryGirl::Syntax::Methods

  config.after(:each) do
    # some model deletion
    model.delete_all
  end

  config.include FeatureHelpers
end

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @shared_connection || retrieve_connection
  end
end

# # Forces all threads to share the same connection. This works on Capybara
# # because it starts the web server in a thread
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

FactoryGirl.reload

person krabbi    schedule 10.03.2014    source источник
comment
Какой подход вы используете для работы с содержимым базы данных и транзакциями? (См. rubydoc.info/github/jnicklas/capybara/)   -  person Lencho Reyes    schedule 10.03.2014
comment
Я использую смесь подхода Хосе Валима и метода по умолчанию. По сути, я еще не понимаю, как каждая часть работает под капотом. Поэтому я обычно стараюсь собрать все вместе, как рекомендовано или в официальной документации.   -  person krabbi    schedule 10.03.2014
comment
@Lencho: не могли бы вы объяснить мне, почему это как-то связано с базой данных в spec_helper, или дать мне ссылку для чтения?   -  person krabbi    schedule 10.03.2014
comment
Это было натянуто, но недавно у меня была похожая проблема, и я думал, что она никак не связана с базой данных в другом потоке, и это произошло. Читая ваши комментарии к ответу, я не думаю, что могу многое добавить к тому, что вы уже преследуете. Если вы используете очиститель базы данных, не используйте общее соединение. Задокументировано, что общее соединение иногда приводит к непоследовательному поведению в тестовых примерах (например, иногда они работают, а иногда нет, даже если код не изменился).   -  person Lencho Reyes    schedule 11.03.2014
comment
Спасибо за помощь в любом случае   -  person krabbi    schedule 12.03.2014


Ответы (1)


Это новая установка capybara-poltergeist для приложения rails, не могли бы вы проверить разницу между этой и вашей версиями? (мне лень ^_^ )

Gemfile

group :development, :test do
  gem 'rspec-rails'
end

group :test do
  gem 'capybara'
  gem 'database_cleaner'
  gem 'poltergeist'
  gem 'phantomjs', require: 'phantomjs/poltergeist'
end

спец/spec_helper.rb

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/rails'
require 'capybara/rspec'
require 'capybara/rails'
require 'capybara/poltergeist'

Capybara.javascript_driver = :poltergeist

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  config.order = "random"
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = false
  config.infer_base_class_for_anonymous_controllers = false
end

спецификация/поддержка/database_cleaner.rb

require "database_cleaner"

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

спецификация/функции/posts_spec.rb

require "spec_helper"

describe "Posts pages" do
  let!(:post) { create :post } # Factory girl

  it "has post", js: true do
    visit posts_path
    expect(page).to have_content post.title
  end
end
person itsnikolay    schedule 10.03.2014
comment
Спасибо за быстрый ответ. Я попробую это и познакомлю вас с последними данными. - person krabbi; 10.03.2014
comment
Пока выглядит хорошо. Подозрительная спецификация пока работает. Это сводится к материалу DatabaseCleaner. Остальное кажется неважным. Можете ли вы дать мне объяснение или ссылку для дальнейшего чтения, пожалуйста? Я не понимаю, какое отношение нажатие на ссылку, запрашивающую js, имеет к DatabaseCleaner или моему предыдущему, я полагаю, неправильному spec_helper. - person krabbi; 10.03.2014
comment
Я ответил на ваш вопрос? Это хорошая статья о тестировании полного стека в рельсах. (также есть пояснение по поводу database_cleaner): robots.thoughtbot.com/how-we- тестовые рельсы-приложения - person itsnikolay; 10.03.2014
comment
Что ж, сначала мне придется взглянуть на свой набор тестов, если я смогу использовать подход только для DatabaseCleaner. Хотя я еще этого не понимаю, я приму ваш ответ, если мой набор будет работать, потому что вы указываете правильное направление. Также большое спасибо за ссылку. - person krabbi; 10.03.2014
comment
Хм, опять такое же несоответствие :( . Надо завтра разобраться. Может быть, мой Javascript или его включение неправильно. - person krabbi; 10.03.2014
comment
Решение пока не найдено :( Я принимаю ваш ответ. Он напомнил мне о этот пост Авди Гримма о настройке DatabaseCleaner и вы дали мне более чистый шаблон spec_helper :) . Спасибо! - person krabbi; 12.03.2014