web-dev-qa-db-fra.com

DatabaseCleaner est-il toujours nécessaire avec les spécifications système Rails?

D'après tout ce que j'ai lu sur Rails 5.1 nouvelles spécifications du système, j'ai compris que Rails gère désormais les transactions de base de données en interne).

From Rspec's blog : "[auparavant] vos tests et votre code sous test ne peuvent pas partager une transaction de base de données, et vous ne pouvez donc pas utiliser le mécanisme intégré de RSpec pour annuler les modifications de la base de données, nécessitant plutôt un joyau comme un nettoyeur de base de données . Avec les tests du système, l'équipe Rails a fait le gros travail pour s'assurer que ce n'est pas le cas, et vous pouvez donc utiliser en toute sécurité le mécanisme de RSpec, sans avoir besoin d'une gemme supplémentaire. "

Mon expérience est différente:

  1. Mes tests de fonctionnalité Rspec passaient tous après la mise à niveau vers Rails 5.1.
  2. J'ai renommé les spécifications "fonction" pour devenir des spécifications "système". Tous les tests ont réussi.
  3. J'ai supprimé la gemme Database Cleaner et supprimé toutes les références de Rails_helper.rb. Les tests JS échouent maintenant en raison de validates uniqueness les erreurs. Les tests non JS réussissent.

Mes tests sont très simples.

let(:subject) { page }
let(:user) { create :user, name: "TestUser" }
it "displays the user page", :js do
  visit user_path(user)
  it is_expected.to have_content "TestUser"
end

Avec le nettoyeur de base de données désactivé et :js => true Je reçois user named TestUser already exists. Avec :js => false le test réussit.

Quelle est la situation actuelle avec les tests système et rspec? Rails gère-t-il les transactions de base de données en interne, ou est-ce que Database Cleaner est toujours requis? Quelqu'un l'a-t-il rencontré ou peut-il me diriger vers des informations pertinentes?

19
Andy Harvey

Vous n'avez pas besoin de la gem DatabaseCleaner. Voici un bref résumé des étapes dont vous avez besoin:

  1. Retirer capybara-Selenium bijou et database_cleaner bijou
  2. Ajouter Selenium-webdriver bijou
  3. Assurez-vous que vous utilisez Rails 5.1.5 ou version ultérieure. Les versions antérieures de Rails 5.1 avaient un défaut dans ActionDispatch :: SystemTesting :: Server qui a causé des problèmes ( fixe ici ).
  4. Dans ton Rails_helper fichier, définissez config.use_transactional_fixtures = true
  5. Si vous utilisez Devise pour l'authentification, dans votre fichier Rails_helper, définissez config.include Devise::Test::IntegrationHelpers, type: :system
  6. Mettre en place un basic_configure fichier selon cet article par Noel Rappin .
  7. Remplacer RSpec.feature partout avec RSpec.describe.

Voir ce commit pour plus de détails sur la façon dont j'ai géré le commutateur. C'était un problème, mais j'espère plus facile maintenant que la version 5.1.5 a corrigé le problème ActionDispatch :: SystemTesting :: Server (j'ai dû corriger le fichier en 5.1.4, mais vous n'aurez pas à le faire maintenant).

21
moveson