[RUBY] ActiveRecord :: RecordInvalid: la validation a échoué: l'e-mail a déjà été pris en erreur dans le test RSpec

Soyez assuré que tous les tests ont été réussis avec RSpec! Quand je le pousse et que je vois le résultat du test de CircleCI,

** Gyaaaa! !! De nombreux tests ont échoué! !! ** **

Voici une partie de la déclaration d'erreur

Error!



ActiveRecord::RecordInvalid:Validation failed: Email has already been taken

Il est probable que la validation a échoué dans le deuxième test CircleCI et qu'une erreur s'est produite car les données de test n'ont pas été supprimées (annulées) et sont restées lorsque l'exécution du premier test s'est terminée. En d'autres termes, l'adresse e-mail était déjà enregistrée, donc lorsque j'ai exécuté le deuxième test, les données de test n'ont pas pu être générées et cela a échoué.

S'il s'agit d'une spécification de fonctionnalité, vous pouvez résoudre ce problème en insérant une gemme appelée database_cleaner. Si vous insérez cette gemme, elle annulera la base de données à la fin du test.

Cependant, le test que j'ai fait concerne les spécifications du système. Les spécifications système ont été introduites à partir de RSpec 3.7 et restaurent le DB de données de test par défaut. database_cleaner n'est pas requis.

Mais pourquoi n'a-t-il pas été reculé ... J'étais perdu ...

Solution

Cela a été fait en un instant.

rails_helper.rb


 RSpec.configure do |config|
  config.use_transactional_fixtures = true
  #↑ Cette phrase était fausse
~ (Omis) ~
end

Le paramètre d'annulation de la transaction était faux. Lorsque j'utilisais les spécifications des fonctionnalités, je définissais ceci sur false lors de l'installation du gem database_cleaner, j'ai donc exécuté les spécifications système avec ce paramètre.

Le simple fait de définir cette modification sur true ne fera que restaurer la base de données, et le test échouera également car les données de test actuelles restent toujours. Après cela, vous devez réinitialiser les données de base de données dans l'environnement de test. ..


docker-compose run app rails db:migrate:reset RAILS_ENV=test

Après cela, le test a réussi.

Merci d'avoir lu jusqu'au bout!

Sort un apprentissage quotidien! !! Nous sommes impatients de vous aider même un peu! De plus, si vous avez des suggestions ou des impressions, je vous serais reconnaissant de bien vouloir commenter!

Recommended Posts

ActiveRecord :: RecordInvalid: la validation a échoué: l'e-mail a déjà été pris en erreur dans le test RSpec
Problème "L'e-mail a déjà été pris" et solution de contournement dans le test d'unicité d'e-mail de RSpec