From eda47effc4a6abd96ae8503c14f0b26e1f95d3b2 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 24 Feb 2016 11:37:07 +0100 Subject: [PATCH] Configures tests to minimize flackyness Reference: https://bibwild.wordpress.com/2016/02/18/struggling-towards-reliable-capybara-javascript-testing/ The only thing I did not do was removing the random order in the tests. --- config/environments/test.rb | 7 ++++++- spec/rails_helper.rb | 3 +++ spec/spec_helper.rb | 38 ++++++++++++++++++++++++++++++++++--- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/config/environments/test.rb b/config/environments/test.rb index cef568af6..4912a6cc2 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -10,7 +10,12 @@ Rails.application.configure do # Do not eager load code on boot. This avoids loading your whole application # just for the purpose of running a single test. If you are using a tool that # preloads Rails for running tests, you may have to set it to true. - config.eager_load = false + config.eager_load = true + + # Setting allow_corrency to false tells rails to force every request to + # "wait in line", serving one after the other + # Setting eager_load to true also sets allow_concurrency to true. + config.allow_concurrency = false # Configure static file server for tests with Cache-Control for performance. config.serve_static_files = true diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index b0257d60c..5b2f2c85a 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -19,6 +19,9 @@ ActiveRecord::Migration.maintain_test_schema! RSpec.configure do |config| config.infer_spec_type_from_file_location! + config.after :each do + Warden.test_reset! + end end Capybara.javascript_driver = :poltergeist diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 5722372ee..80d88bc54 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -18,14 +18,46 @@ RSpec.configure do |config| DatabaseCleaner.clean_with :truncation end + config.before(:suite) do + if config.use_transactional_fixtures? + raise(<<-MSG) + Delete line `config.use_transactional_fixtures = true` from rails_helper.rb + (or set it to false) to prevent uncommitted transactions being used in + JavaScript-dependent specs. + + During testing, the app-under-test that the browser driver connects to + uses a different database connection to the database connection used by + the spec. The app's database connection would not be able to access + uncommitted transaction data setup over the spec's database connection. + MSG + end + DatabaseCleaner.clean_with(:truncation) + end + config.before(:each) do |example| - DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction - DatabaseCleaner.start + DatabaseCleaner.strategy = :transaction I18n.locale = :en load "#{Rails.root}/db/seeds.rb" end - config.after(:each) do + config.before(:each, type: :feature) do + # :rack_test driver's Rack app under test shares database connection + # with the specs, so continue to use transaction strategy for speed. + driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test + + if !driver_shares_db_connection_with_specs + # Driver is probably for an external browser with an app + # under test that does *not* share a database connection with the + # specs, so use truncation strategy. + DatabaseCleaner.strategy = :truncation + end + end + + config.before(:each) do + DatabaseCleaner.start + end + + config.append_after(:each) do DatabaseCleaner.clean end