Rspec - Comment nettoyer la base de données après chaque test

J'ai une fonction spec avec Capybara pour une page de connexion, et je suis en utilisant FactoryGirl + DatabaseCleaner

require 'rails_helper'

feature 'Admin signs in' do

  background do
    FactoryGirl.create(:user)
  end

  scenario 'with valid credentials' do
    visit admin_root_path
    fill_in 'user_email', :with => '[email protected]'
    fill_in 'user_password', :with => 'testpassword'
    click_button 'Sign in'
    expect(page).to have_content('Dashboard')
  end

  scenario 'with invalid credentials' do
    visit admin_root_path
    fill_in 'user_email', :with => '[email protected]'
    fill_in 'user_password', :with => 'wrongpassword'
    click_button 'Sign in'
    expect(page).to have_content('Admin Login')
  end

end

exécution du test, j'obtiens l'erreur suivante:

1) Admin signs in test with invalid credentials
 Failure/Error: FactoryGirl.create(:user)
 ActiveRecord::RecordInvalid:
   Validation failed: Email has already been taken

J'ai pensé DatabaseCleaner permettrait d'annuler les changements, mais il semble que l'enregistrement de l'utilisateur persistent dans la base de données jusqu'à la deuxième scénario bloc.

Comment puis-je m'assurer que la base de données est nettoyé après le premier scénario?

J'ai configuré la Base de données de nettoyant à la suite de cette post

# support/database_cleaner_spec.rb

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

J'ai aussi mis à jour le spec helper fichier avec:

config.use_transactional_fixtures = false

OriginalL'auteur Carlo | 2015-04-06