Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails integration test with selenium as webdriver - can't sign_in

Hi
I have a very simple integration test

require 'integration_test_helper'
Capybara.current_driver = :rack_test

class AdminSignsInTest < ActionDispatch::IntegrationTest

  test 'can sign in' do
    email = '[email protected]'
    password = 'secret_password'
    Admin.create email: email, password: password

    visit new_admin_session_path
    fill_in 'admin_email', with: email
    fill_in 'admin_password', with: password

    click_button I18n.t('devise.views.sign_in')

    assert_equal I18n.t('devise.sessions.signed_in'), find('p.notice').text
  end
end

When I set Capybara driver to rack_test test passes, but when I set it to selenium, it fails with 'Invalid email or password.' on the login page (I'm using Devise). What am I doing wrong?

like image 225
Art Shayderov Avatar asked May 27 '11 15:05

Art Shayderov


2 Answers

When I set Capybara driver to rack_test test passes, but when I set it to selenium, it fails with 'Invalid email or password.' on the login page (I'm using Devise). What am I doing wrong?

You'll have to check use_transactional_fixtures. When using transactional fixtures, because Selenium (or, any of the external drivers, which aren't Rack::Test) do not have access to information that has been written to the database. (as the transaction hasn't been "Committed")

You can resolve this inside of your test_helper.rb with the following:

class ActionDispatch::IntegrationTest
  self.use_transactional_fixtures = false
end

You may want, at the same time to look into something like Database Cleaner, as without transactional fixtures, your database will become untidy.

like image 57
Lee Hambley Avatar answered Nov 06 '22 11:11

Lee Hambley


From http://opinionatedprogrammer.com/2011/02/capybara-and-selenium-with-rspec-and-rails-3/:

You will also need DatabaseCleaner, since transactional fixtures do not work with Selenium. Add the database_cleaner gem to the :test group of your Gemfile and put the following code into spec/support/database_cleaner.rb:

DatabaseCleaner.strategy = :truncation

RSpec.configure do |config|
  config.use_transactional_fixtures = false
  config.before :each do
    DatabaseCleaner.start
  end
  config.after :each do
    DatabaseCleaner.clean
  end
end
like image 43
mattwindwer Avatar answered Nov 06 '22 09:11

mattwindwer