1

Je suis nouveau dans les rails. Dans mon projet, j'utilise rspec + capybara + poltergeist + selenium + database_cleaner.Rails nettoyer la base de données entre les tests ne fonctionne pas

code source github link

Je postgresql 9.5.5, ubuntu 16.04 LTS.

Lors de l'exécution Test

rspec spec/controllers # everything work fine 

Effectué

rspec spec/features # everything work fine too 

Mais quand je lance tous les tests

rspeC# part of tests fail 

Effectué premier test d'acceptation avec: sélénium -> question_id dans le navigateur 28 , mais doit être 1, car il utilise database_cleaner.

Pourquoi database_cleaner ne nettoie pas ma base de données? Ce que je fais mal? J'ai passé une journée à trouver une solution, mais je n'ai rien trouvé. Aidez-moi s'il vous plaît.

P.S. C'est un projet de formation.

Ma configuration Database_Cleaner est:

config.use_transactional_fixtures = false 

    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 
    Warden.test_reset! 
    if Rails.env.test? 
     FileUtils.rm_rf(Dir["#{Rails.root}/public/uploads"]) 
    end 
    end 
+1

Pourquoi pensez-vous que dans doit être 1? Selon la façon dont vous avez installé database_cle aner il est possible que la base de données soit vide mais ne réinitialise pas le compteur de colonne d'identification - Avez-vous interrogé la base de données pour voir combien de questions y sont enregistrées? Vos tests ne doivent contenir aucun identifiant d'enregistrement codé en dur.Si ce n'est pas le cas, ajoutez un de vos tests et votre configuration database_cleaner à votre question. –

+0

J'ajoute les fichiers à la question. Et par défaut je pense, cette question dans db est une, et le lien vers le fichier ajouté doit avoir un lien href: '/ uploads/attachment/file/1/test_fichier.dat', où 1 est l'identifiant de la question. Mais en réalité, l'identifiant de la question est 28. Je pensais que les bases de données nettoyaient les tables propres chaque fois que le test s'exécute. –

+1

@ThomasWalpole - Je comprends ce que vous dites. Oui, la table a juste 1 rangée. J'ai besoin de réécrire mes tests. Merci pour la solution. –

Répondre

2

Nettoyage des tables signifie qu'il supprime tous les enregistrements, cela ne signifie pas nécessairement il réinitialise les compteurs d'index - comme si vous supprimiez l'enregistrement 3 et que vous ajoutiez un nouvel enregistrement - le nouveau serait 4. Donc dans votre cas, il est possible que 27 enregistrements aient été supprimés et le suivant que vous créez soit 28 même s'il y a seulement 1 enregistrement réel. Interrogez la base de données pour voir combien d'enregistrements réels sont là pour vérifier cela.

Ensuite, la configuration de votre nettoyeur de base de données devrait ressembler davantage à la configuration recommandée - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example. append_after vs after est important pour la stabilité et la vérification du nom du pilote par rapport à: js metadata aussi. Lorsque vous recherchez href '/ uploads/attachment/file/1/test_fichier.dat' dans vos tests, vous ne devriez pas rechercher un '1' codé en dur, vous devriez vérifier en fonction du numéro d'identification de l'enregistrement. enregistrer vous avez créé. Donc "/uploads/attachment/file/#{question.id}/test_file.dat" (évidemment question.id dépendra des objets que vous avez créés et de vos noms de variables, mais cela correspond au moins à l'un de vos tests je pense.)

en outre, après un rapide coup d'oeil à vos spécifications -.. où vous faites expect(current_path).to eq ... est faux que vous devriez faire expect(page).to have_current_path(...) la première désactive le comportement de réessayant Capybara et conduira à des tests floconneux

et enfin. - où vous avez expect(page).not_to have_content t('common.button.ready'), je devine que cela devrait être expect(page).not_to have_button t('common.button.ready')

+0

Merci pour la réponse détaillée. –