Domanda

Il mio problema è sorto nel capitolo 11 del Ruby on Rails Tutorial qui .

che stavo vedendo questo errore rspec:

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

prima in user_spec.rb poi in micropost_spec.rb. E 'stato abbastanza sconcertante. Ho pensato che le dichiarazioni di fabbrica sono stati generando un utente in un test fresco db ogni volta autotest corse RSpec. Ho controllato i file di origine dal ramo principale con git e ancora una volta provato, ma ho visto lo stesso errore. Pertanto, sospettato in relazione ai contenuti db in qualche modo e non il codice.

Quindi, ho fatto quanto segue:

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

... e tutto è andato verde. I test RSpec passati.

Non ci può essere un altro “al punto” soluzione, ma sono rimasto basito questo ha funzionato. Speranza che aiuta qualcun altro. Io sono rimasto a concludere che il mio test / sviluppo in qualche modo aggiunto qualcosa al db che è stato inaspettato. Suppongo che i passaggi precedenti sono un buon modo per farsi un db fresca verso la fine del capitolo 11.

ci fosse un modo più diretto per risolvere questo? L'errore indicare qualche altro problema che ho affrontato senza rendersene conto? Sto pensando di sinistra che in esecuzione rspec non garantisce un test fresco db ogni volta. È un presupposto sbagliato?

È stato utile?

Soluzione

Ho avuto problemi con i test di integrazione, poco dopo il capitolo 9.4. Tutti i miei test controller e il test di richiesta di integrazione fatto saltare in aria con il messaggio 'e-mail è già stata presa'

Quello che ho imparato da RailsTutorial - capitolo 8.4.3 - database di test non compensazione dopo l'aggiunta dell'utente nel test di integrazione è che avete bisogno di fare qualcosa per pulire dopo i test di integrazione, perché a differenza di unit test non può fino pulito dopo stessi.

La soluzione presentata c'era di utilizzare la DatabaseCleaner gioiello, la cui attuazione si spiega anche in la questione legata.

Credo che se non si implementa qualche strategia per la pulizia dopo il test di integrazione si continuerà ad avere per utilizzare la soluzione 'fucile' per ripulire il DB ogni volta che si esegue la suite di test. Sicuramente non è divertente.

Altri suggerimenti

Questo funziona per me:

bundle exec rake db:test:prepare

E 'anche nel tutorial.

Per quanto mi riguarda, la questione sembrava essere in esecuzione Spork. Dopo il riavvio si posso eseguire i test tutte le volte che ho bisogno.

Mi ha aiutato, ha aggiunto al file factories

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

Nel mio caso problema era in equals email in

factory :user

e

factory :user_with_additional_options
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top