with spec run rails describe ruby-on-rails testing seed

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)