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
Vous devez vous connecter pour publier un commentaire.
J'ai été, à tort, en supposant que les fichiers de configuration dans spec/support dossier sont automatiquement chargés, mais il s'avère que j'ai eu de décommenter la ligne suivante dans spec/rails_helper.rb
La DatabaseCleaner fichier de configuration est correcte, elle n'est pas chargée.
OriginalL'auteur Carlo
Assurez-vous d'avoir la configuration suivante dans spec/rails_helper.rb
L'idée est de commencer chaque exemple avec une base de données, créer toutes les données nécessaires pour l'exemple, puis supprimer les données par tout simplement l'annulation de la transaction à la fin de l'exemple.
OriginalL'auteur Rokibul Hasan
l'utilisation de ces paramètres:
OriginalL'auteur kartik upadhyay
Si par hasard, vous êtes à l'aide de MySQL et de la modification de tables (reset auto incrémente ou quoi opération DDL) à l'intérieur d'une méthode à l'intérieur d'un test, la stratégie de transaction va échouer et votre base de données ne seront pas nettoyées.
Afin de correctif, vous devez déclarer une config bloc comme ceci:
Et ajouter cette config pour votre test de contexte:
Remarque: cela va ralentir votre tests, donc soyez prudent de ne pas en abuser.
OriginalL'auteur Fab V.
a fonctionné pour moi!
:example
, aucune des autres réponses n'...before(:suite)
nettoie la DB après chaque test, je crois que c'est ce que l'utilisateur est nécessaire.Juste assez, ont un beau jour.
OriginalL'auteur Paula Muldoon