Search code examples
ruby-on-rails-3capybararspec-rails

Can't create user for testing using capybara with rspec


I want to test a simple sign in flow, which needs a existed user in the test database.

describe 'Signin page' do
  before :each do
    User.generate(:email => '[email protected]', :password => 'palmdrive', :first_name => 'Automatic', :last_name => 'Tester')
  end
  it 'signs in a user', :js => true do 
    signin
    current_path.should == redirect_path    
  end
end

def signin  
  ## Action to sign in the user
end

## Use DatabaseCleaner since selenium driver is used
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

Because the way to create a user is a little bit more complicated, so I defined the User.generate method to create a user. To ensure it actually works, in the rails console with test environment, running User.generate(:email => '[email protected]', :password => 'palmdrive', :first_name => 'Automatic', :last_name => 'Tester')it successfully created a user in database. Comment out the before :each, the test suite passed successfully.

But the problem is running the codes above, the test fails. It was due to the user can't be created in the database. Why can't the User.generate method create a user?


Solution

  • In the spec_helper add:

    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
    

    solves the issue. Then no need to use the DatabaseCleaner either