ruby on rails - tutorial - Rails: haz que esta tarea de rake sea consciente de que está en el entorno de prueba
tdd ruby (2)
Tengo la siguiente tarea de rake definida en mi carpeta lib/tasks
:
namespace :db do
namespace :test do
task :prepare => :environment do
Rake::Task["db:seed"].invoke
end
end
end
Ahora, lo que esto hace es sembrar el DB de prueba cuando ejecuto rake db:test:prepare
. Hago esto porque tengo algunos registros básicos que deben existir para que la aplicación funcione, por lo que no son opcionales y no se pueden burlar.
Por separado, tengo un modelo que usa S3 para el almacenamiento de activos en desarrollo y producción, pero no quiero que use S3 para las pruebas. He configurado un método en el modelo que cambia la ruta de almacenamiento de S3 a local si Rails.env.test?
Sin embargo, esto no está funcionando. Me preguntaba si la tarea de rake era consciente del entorno desde el que se llamaba, y resulta que NO lo es. Pongo esto en la parte superior de mi archivo seeds.rb:
puts "Environment Check: Rails Environment = #{Rails.env}"
Efectivamente, cuando la tarea se ejecuta, se imprime: Revisión de Environment Check: Rails Environment = development
: Environment Check: Rails Environment = development
Entonces, ¿cómo puedo rehacer esta tarea de rake para que cuando esté sembrando el DB de prueba sepa que está sembrando el DB de prueba?
Al leer la fuente de las tareas de db: test , parece que solo se preocupan por capturar la información de la base de datos de prueba de database.yml, pero no les importa en qué entorno real lo están haciendo.
Es posible que deba ejecutar rake db: test: prepare RAILS_ENV = test para asegurarse de que está en el entorno de prueba.
Yo también estaba teniendo este problema; en mi archivo db/seeds.rb
tengo un bloque que crea cuentas de usuario en el entorno de desarrollo, pero también se estaban creando al preparar el entorno de prueba para ejecutar rake
para las pruebas de RSpec o Cucumber, lo que resultó en una pared de color rojo.
Actualizado : he encontrado que la mejor manera de especificar el entorno para las tareas de rake es especificar el entorno dentro de la tarea, sobre todo las declaraciones que necesitan que se establezca el entorno. Así que en este caso:
Rails.env = ''test''
Rake::Task["db:seed"].invoke
hace el trabajo.