7

Mi problema surgió en el Capítulo 11 del Tutorial de Ruby on Rails here.Tutorial de Rails 3 Capítulo 11 "Error de validación: el correo electrónico ya se ha tomado" error

que estaba viendo este error rspec:

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

por primera vez en user_spec.rb después en micropost_spec.rb. Fue bastante desconcertante. Pensé que las declaraciones de fábrica generaban un usuario en una nueva prueba db cada vez que autotest ejecutaba rspec. Revisé los archivos fuente de la rama principal con git e intenté de nuevo, pero vi el mismo error. Por lo tanto, sospeché que estaba relacionado con los contenidos de db de alguna manera y no con el código.

Por lo tanto, hice lo siguiente:

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

... y todo se volvió verde. Las pruebas rspec pasaron.

Puede haber una solución más "al punto", pero estaba encantado de que esto funcionara. Espero que ayude a alguien más. Me queda la conclusión de que mi prueba/desarrollo de alguna manera agregó algo al db que fue inesperado. Supongo que los pasos anteriores son una buena forma de obtener un db nuevo al final del capítulo 11.

¿Hubo una forma más directa de resolver esto? ¿El error indica algún otro problema que abordé sin darme cuenta? Me queda la idea de que ejecutar rspec no garantiza un nuevo DB de prueba cada vez. ¿Es esa una suposición incorrecta?

+3

No había ninguna pregunta aquí ... Este es un sitio de pregunta respuesta =>. Es perfectamente aceptable hacer una pregunta y luego responderla usted mismo, pero la forma en que lo ha hecho no es correcta :( – nzifnab

+0

nzifnab está en lo cierto. Mi post es principalmente una afirmación que, sin embargo, esperaba que fuera útil para algunos Cerré con una pregunta genuina: "Si alguien más pudiera arrojar algo de luz aquí, supongo que eso también sería bueno". Mi 'solución' fue algo así como un enfoque a toda máquina.Todavía no estoy seguro de lo que estaba mal, pero la receta anterior podría ser una solución práctica para aquellos que se sienten cómodos viviendo en la oscuridad. –

+1

Veo tu punto. Podría haber publicado esto como "Tengo errores rspec desconcertantes en el Capítulo 11 ..." Y luego también publicó mi propia respuesta con comentarios. Lo siento. La próxima vez. Si no hubieran sido las 4:00 a.m. hora local, podría haber pensado en esa primera vuelta. P. –

Respuesta

11

Tuve problemas con las pruebas de integración poco después del Capítulo 9.4. Todas mis pruebas de controlador y la prueba de integración de solicitud explotaron con el mensaje 'El correo electrónico ya se ha tomado'

Lo que aprendí del RailsTutorial - chapter 8.4.3 - Test database not clearing after adding user in integration test es que necesitas hacer algo para limpiar después de las pruebas de integración, porque a diferencia de las pruebas unitarias no pueden limpiar después de ellos mismos.

La solución presentada allí era utilizar la gema DatabaseCleaner, cuya implementación también se explica en la pregunta vinculada.

Creo que si no implementa alguna estrategia de limpieza después de la prueba de integración, seguirá teniendo que utilizar su solución 'escopeta' para limpiar el DB cada vez que ejecute el conjunto de pruebas. Definitivamente no es divertido.

+0

Oh. Gracias. Eso retrasa el velo en un misterio personal desconcertante. Esto aquí http://rubydoc.info/gems/database_cleaner/0.6.7/frames parece hablar exactamente al punto. –

4

Esto funciona para mí:

bundle exec rake db:test:prepare

también en el tutorial.

2

Para mí, el problema parecía estar funcionando Spork. Después de reiniciarlo, puedo ejecutar las pruebas tantas veces como lo necesite.

+1

Yo también tuve que reiniciar spork. Lo cual hice al reiniciar mi guardia. Pero eso no resolvió el problema, no fue hasta que corrí, que todo volvió a funcionar para mí. Gracias. – hatunike

1

Ayudó, añade al archivo factories

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