Frage

Meine Probleme traten in Kapitel 11 von Ruby on Rails Tutorial auf hier.

Ich habe diesen RSPEC -Fehler gesehen:

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

erster user_spec.rb dann in micropost_spec.rb. Es war ziemlich rätselhaft. Ich dachte, die Fabrikanweisungen generierten jedes Mal, wenn Autotest RSPEC leitete, einen Benutzer in einem frischen Test -DB. Ich habe Quelldateien aus der Master -Filiale mit Git ausgecheckt und es erneut ausprobiert, aber den gleichen Fehler gesehen. Ich habe daher vermutet, dass es irgendwie mit dem DB -Inhalt und nicht mit dem Code zu tun hat.

Also habe ich Folgendes gemacht:

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

... und alles wurde grün. Die RSPEC -Tests bestanden.

Es mag eine „bis zur Punkt“ -Lösung geben, aber ich war begeistert, dass dies funktioniert hat. Hoffe es hilft jemand anderem. Ich muss zu dem Schluss kommen, dass meine Tests/Entwicklung dem DB, das unerwartet war, etwas hinzugefügt hat. Ich nehme an, die oben genannten Schritte sind eine gute Möglichkeit, sich gegen Ende von Kapitel 11 eine frische DB zu machen.

Gab es eine direktere Möglichkeit, dies zu lösen? Zeigt der Fehler ein anderes Problem an, das ich angesprochen habe, ohne es zu merken? Ich denke, dass das Ausführen von RSPEC nicht jedes Mal einen neuen Test -DB -DB garantiert. Ist das eine falsche Annahme?

War es hilfreich?

Lösung

Ich hatte kurz nach Kapitel 9.4 Probleme mit den Integrationstests. Alle meine Controller -Tests und der Anfrage -Integrationstest haben mit der Nachricht "E -Mail bereits genommen" in die Luft gesprengt.

Was ich gelernt habe RailStutorial - Kapitel 8.4.3 - Testen Sie die Datenbank nicht nach dem Hinzufügen des Benutzers im Integrationstest ist, dass Sie etwas tun müssen, um nach Integrationstests aufzuräumen, da sie im Gegensatz zu Unit -Tests möglicherweise nicht nach sich selbst gereinigt werden.

Die dort vorgestellte Lösung bestand darin, die zu verwenden Databasecleaner Gem, deren Umsetzung auch in der verknüpften Frage erklärt wird.

Ich denke, wenn Sie nach dem Integrationstest keine Strategie zur Reinigung implementieren, müssen Sie weiterhin Ihre "Shotgun" -Lösung verwenden, um die DB jedes Mal zu reinigen, wenn Sie die Testsuite durchführen. Auf keinen Fall macht es keinen Spaß.

Andere Tipps

Das funktioniert für mich:

bundle exec rake db:test:prepare

Es ist auch im Tutorial.

Für mich schien das Problem Spork zu laufen. Nach dem Neustart kann ich die Tests so oft ausführen, wie ich brauche.

Es half, der Datei hinzugefügt wurde factories

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

In meinem Fall war das Problem in gleicher E -Mails in

factory :user

und

factory :user_with_additional_options
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top