Question

Mon survient des problèmes au chapitre 11 du Tutoriel Ruby on Rails ici .

Je voyais cette erreur rspec:

Failure/Error: :user => Factory(:user, :email => Factory.next(:email)))
     ActiveRecord::RecordInvalid:
       Validation failed: Email has already been taken

d'abord en user_spec.rb puis à micropost_spec.rb. Il était assez déconcertant. Je pensais que les déclarations d'usine généraient un utilisateur dans un test frais db chaque fois RAN rspec Autotest. J'ai vérifié les fichiers source de la branche principale avec git et essayé encore, mais vu la même erreur. Je doutais donc lié au contenu de db en quelque sorte et non le code.

Alors, je l'ai fait ce qui suit:

restarted "rails s"  
restarted autotest  
rake db:reset  
rake db:migrate  
rake db:test:prepare  
rake db:populate  

... et tout est allé vert. Les tests rspec passés.

Il peut être un plus « au point » solution, mais j'ai frissonné cela a fonctionné. Hope it helps quelqu'un d'autre. Je reste à conclure que mes tests / développement en quelque sorte ajouté quelque chose à la db qui était inattendu. Je suppose que les étapes ci-dessus sont une bonne façon de vous faire une nouvelle db à la fin du chapitre 11.

Y avait-il une façon plus directe pour résoudre ce problème? L'erreur indique une autre question que j'adressais sans en rendre compte? Je pense que la course gauche rspec ne garantit pas un test db frais à chaque fois. Est-ce une hypothèse erronée?

Était-ce utile?

La solution

J'ai eu du mal avec les tests d'intégration peu de temps après le chapitre 9.4. Tous mes tests de contrôleur et le test d'intégration de la demande fait exploser avec le message « E-mail a déjà été prise »

Ce que j'appris de RailsTutorial - chapitre 8.4.3 - base de données de test non compensation après ajout de l'utilisateur dans le test d'intégration est que vous devez faire quelque chose pour nettoyer après les tests d'intégration, parce que les tests unitaires à la différence qu'ils ne peuvent pas nettoyer après eux-mêmes.

La solution présentée était d'utiliser le DatabaseCleaner petit bijou, la mise en œuvre est également expliquée la question liée.

Je pense que si vous ne mettez pas en œuvre une stratégie pour le nettoyage après le test d'intégration que vous continuerez à utiliser votre solution « shotgun » pour le nettoyage de la base de données chaque fois que vous exécutez la suite de tests. Certainement pas amusant.

Autres conseils

Cela fonctionne pour moi:

bundle exec rake db:test:prepare

Il est également dans le tutoriel.

Pour moi, la question semblait être en cours d'exécution Spork. Après avoir redémarré, je peux exécuter les tests autant de fois que j'ai besoin.

Il a aidé, a ajouté au fichier factories

sequence(:email) {|n| "person#{n}@example.com" }

Dans mon problème de cas était en equals dans des e-mails

factory :user

et

factory :user_with_additional_options
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top