Capybara with :js => true causes test to fail Capybara with :js => true causes test to fail javascript javascript

Capybara with :js => true causes test to fail


I've read the Capybara readme at https://github.com/jnicklas/capybara and it solved my issue.

Transactional fixtures only work in the default Rack::Test driver, but not for other drivers like Selenium. Cucumber takes care of this automatically, but with Test::Unit or RSpec, you may have to use the database_cleaner gem. See this explanation (and code for solution 2 and solution 3) for details.

But basically its a threading issue that involves Capybara having its own thread when running the non-Rack driver, that makes the transactional fixtures feature to use a second connection in another context. So the driver thread is never in the same context of the running rspec.

Luckily this can be easily solve (at least it solved for me) doing a dynamic switching in th DatabaseCleaner strategy to use:

RSpec.configure do |config|  config.use_transactional_fixtures = false  config.before :each do    if Capybara.current_driver == :rack_test      DatabaseCleaner.strategy = :transaction    else      DatabaseCleaner.strategy = :truncation    end    DatabaseCleaner.start  end  config.after do    DatabaseCleaner.clean  endend


A variation of brutuscat's answer that fixed our feature specs (which all use Capybara):

config.before(:suite) do  DatabaseCleaner.clean_with(:truncation)endconfig.before(:each) do  # set the default  DatabaseCleaner.strategy = :transactionendconfig.before(:each, type: :feature) do  DatabaseCleaner.strategy = :truncationendconfig.before(:each) do  DatabaseCleaner.startendconfig.append_after(:each) do  DatabaseCleaner.cleanend


There is another way to deal with this problem now described and discussed here: Why not use shared ActiveRecord connections for Rspec + Selenium?