Estoy intentando utilizar la nueva forma estándar de cargar datos semilla en Rails 2.3.4+, el db:seed
tarea de rastrillo.
Estoy cargando datos constantes, que son necesarios para que mi aplicación realmente funcione correctamente.
¿Cuál es la mejor manera de db:seed
ejecutar la tarea antes de las pruebas, para que los datos se completen previamente?
ruby-on-rails
testing
seed
Luke Francl
fuente
fuente
test_helper.rb
no funcionó para mí, aunque stackoverflow.com/a/1998520/68210 sí.Rails.application.load_seed
justo debajorequire 'rspec/rails'
de mi archivo rails_helper. Si está utilizando database_cleaner gem, requerirá un pequeño ajuste para asegurarse de que no pierda sus datos de semilla después de cada prueba y puede encontrarlo en la documentación de la gema en sí mismatest/test_helper.rb
después de larequire 'rails/test_help'
línea existenteYo diría que debería ser
Porque db: test: load no se ejecuta si tiene config.active_record.schema_format =: sql (db: test: clone_structure is)
fuente
--trace
me ayudó a entender cómo funciona esto.task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
antesRake::Task["db:seed"].invoke
db:seed
ejecuta esdevelopment
... extraño.Poner algo como esto en lib / task / test_seed.rake debería invocar la tarea inicial después de db: test: load:
fuente
Creo que el comentario anterior de Steve 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 forma conveniente de ejecutar este archivo una vez antes de todas las pruebas (vea este problema de Github ). Deberá cargar los datos una vez antes de cada prueba, probablemente en el método de configuración de sus archivos de prueba:
Usando RSpec
Utilice el
before(:all)
método de RSpec para cargar datos de inicialización para todas las pruebas para este modelo:Espero que esto ayude.
fuente
before(:suite)
lugar de hacerlobefore(:all)
. Publicó una respuesta separada para incluir código formateado.Invocamos db: seed como parte de db: test: prepare, con:
Rake::Task["db:seed"].invoke
De esa forma, los datos de inicialización se cargan una vez para toda la ejecución de prueba, y no una vez por clase de prueba.
fuente
Para aquellos que usan el banco de semillas, cambia la forma en que se cargan las semillas, por lo que probablemente no pueda / no quiera usar la
load ...
solución provista aquí.Y solo poner
Rake::Task['db:seed'].invoke
en test_helper resultó en:Pero cuando agregamos load_tasks antes de eso, funcionó:
fuente
Agregar
Rake::Task["db:seed"].invoke
a ladb:test:prepare
tarea de rastrillo no funcionó para mí. Si preparé la base de datos conrake 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.Sin
load "#{Rails.root}/db/seeds.rb"
embargo, agregar a mi método de configuración funcionó bien.Me encantaría que estas semillas se cargaran automáticamente y persistieran, ¡pero todavía no he encontrado la manera de hacerlo!
fuente
Sobre la base de la respuesta de Matt, si toma ese tipo de ruta, recomiendo llamar
Rails.application.load_seed
en unbefore(:suite)
bloque enrspec_helper.rb
lugar de en unbefore(:all)
bloque en cualquier archivo. De esta forma, el código inicial se invoca solo una vez para todo el conjunto de pruebas en lugar de una vez para cada grupo de pruebas.rspec_helper.rb:
fuente