ruby on rails - spec - ¿Cómo cargar db: sembrar datos en la base de datos de prueba automáticamente?
rspec with rails (7)
Estoy intentando utilizar la nueva forma estándar de cargar datos semilla en Rails 2.3.4+, la tarea db:seed
rake.
Estoy cargando datos constantes, que se requieren para que mi aplicación realmente funcione correctamente.
¿Cuál es la mejor manera de ejecutar la tarea db:seed
antes de las pruebas, para que los datos se rellenen previamente?
Agregar Rake::Task["db:seed"].invoke
a la tarea db:test:prepare
rake no funcionó para mí. Si preparé la base de datos con rake db:test:prepare
, y luego ingresé a la consola dentro del entorno de prueba, todas mis semillas estaban allí. Sin embargo, las semillas no persistieron entre mis pruebas.
load "#{Rails.root}/db/seeds.rb"
agregar la load "#{Rails.root}/db/seeds.rb"
a mi método de instalación funcionó bien.
Me encantaría que estas semillas se carguen automáticamente y persistan, ¡pero aún no he encontrado la forma de hacerlo!
Creo que el comentario de Steve anterior debería ser la respuesta correcta. Puede usar Rails.application.load_seed
para cargar datos de inicialización en su entorno de prueba. Sin embargo, cuándo y con qué frecuencia se cargan estos datos depende de algunas cosas:
Usando Minitest
No hay una manera conveniente de ejecutar este archivo una vez antes de todas las pruebas (consulte este problema de Github ). Tendrá que cargar los datos una vez antes de cada prueba, probablemente en el método de configuración de sus archivos de prueba:
# test/models/my_model_test.rb
class LevelTest < ActiveSupport::TestCase
def setup
Rails.application.load_seed
end
# tests here...
end
Usando RSpec
Use el método RSpec''s before(:all)
para cargar datos de inicialización para todas las pruebas para este modelo:
describe MyModel do
before(:all) do
Rails.application.load_seed
end
describe "my model..." do
# your tests here
end
Espero que esto ayude.
Estamos invocando db: seed como parte de db: test: prepare, con:
Rake::Task["db:seed"].invoke
De esta forma, los datos de inicialización se cargan una vez para la prueba completa y no una vez por clase de prueba.
La tarea db:seed
rake solo carga el db/seeds.rb
. Por lo tanto, simplemente ejecuta ese archivo para cargar los datos.
load "#{Rails.root}/db/seeds.rb"
Dónde ubicarlo depende de qué marco de prueba esté utilizando y si desea que se cargue antes de cada prueba o solo una vez al principio. Puede ponerlo en una llamada de setup
o en un archivo test_helper.rb
.
Para quienes usan el banco de semillas, cambia la forma en que se cargan las semillas, por lo que probablemente no pueda / no quiera utilizar la solución de load ...
proporcionada aquí.
Y simplemente poner Rake::Task[''db:seed''].invoke
Invocar en test_helper resultó en:
Don''t know how to build task ''db:seed'' (RuntimeError)
Pero cuando agregamos load_tasks antes de eso, funcionó:
MyApp::Application.load_tasks
Rake::Task[''db:seed''].invoke
Poniendo algo así en lib / tasks / test_seed.rake debería invocar la tarea de inicialización después de db: test: load:
namespace :db do
namespace :test do
task :load => :environment do
Rake::Task["db:seed"].invoke
end
end
end
Yo diría que debería ser
namespace :db do
namespace :test do
task :prepare => :environment do
Rake::Task["db:seed"].invoke
end
end
end
Debido a que db: test: load no se ejecuta si tiene config.active_record.schema_format =: sql (db: test: clone_structure)