Pregunta

Mi problema surgió en el Capítulo 11 del tutorial Ruby on Rails aquí.

Estaba viendo este error rspec:

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

primero en user_spec.rb luego en micropost_spec.rb. Fue bastante desconcertante. Pensé que las declaraciones de fábrica estaban generando un usuario en un DB de prueba fresco cada vez que Autotest Ran RSPEC. Revisé los archivos de origen de la rama maestra con Git e intenté nuevamente, pero vi el mismo error. Por lo tanto, sospeché que se relacionó con el contenido de DB de alguna manera y no con el código.

Entonces, 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 otra persona. Me queda concluir que mi prueba/desarrollo de alguna manera agregó algo al DB que era inesperado. Supongo que los pasos anteriores son una buena manera de convertirse en un DB fresco cerca del final del Capítulo 11.

¿Había una forma más directa de resolver esto? ¿El error indica algún otro problema que abordé sin darme cuenta? Me quedo pensando que ejecutar RSPEC no garantiza una nueva base de datos cada vez. ¿Es esa una suposición incorrecta?

¿Fue útil?

Solución

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 solicitudes explotaron con el mensaje 'El correo electrónico ya se ha tomado'

Lo que aprendí de Esttutorial de ferrocarril - Capítulo 8.4.3 - Prueba de datos de datos no se borra después de agregar el usuario en la prueba de integración es que debe hacer algo para limpiar después de las pruebas de integración, porque a diferencia de las pruebas unitarias, pueden no limpiar después de sí mismos.

La solución presentada allí era usar el Databaseaner GEM, cuya implementación también se explica en la pregunta vinculada.

Creo que si no implementa una estrategia para limpiar después de la prueba de integración, continuará teniendo que usar su solución de 'escopeta' para limpiar el DB cada vez que ejecute la suite de prueba. Definitivamente no es divertido.

Otros consejos

Esto funciona para mí:

bundle exec rake db:test:prepare

También está en el tutorial.

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

Ayudó, se agregó al archivo factories

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

En mi caso, el problema estaba en iguales correos electrónicos en

factory :user

y

factory :user_with_additional_options
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top