rails matchers ruby-on-rails ruby-on-rails-3 rspec

ruby on rails - matchers - Con RSpec, ¿cómo sembrar la base de datos en carga?



rspec rails 5 (6)

En spec_helper.rb:

RSpec.configure do |config| config.before(:suite) do Rails.application.load_seed # loading seeds end end

Estoy usando rspec para probar la aplicación w my rails 3. Necesito sembrar la base de datos antes de que comiencen las pruebas. ¿Cómo puedo sembrar la base de datos con lo siguiente?

/db/seeds.rb

["Admin", "Member"].each do |role_name| Role.find_or_create_by_name(role_name) end

Gracias


He seguido el furioso debate en Auto-cargar los datos de inicialización de db / seeds.rb con rake . Los recalcitrantes sostienen que nunca se deben cargar datos iniciales para las pruebas, pero yo tomo la postura más moderada de que hay ocasiones en las que es posible que desee cargar datos semilla para pruebas específicas , por ejemplo, verificar que existan los datos iniciales.

A diferencia de algunas respuestas dadas aquí, no recomiendo cargar incondicionalmente las semillas desde adentro de su archivo spec_helper. En su lugar, puedes cargar tus semillas usando before :each o before :all dentro de esos archivos de prueba que necesitan las semillas, por ejemplo:

describe "db seed tests" do before(:each) do load "#{Rails.root}/db/seeds.rb" end ...your test code here... end

actualizar

Como señala @marzapower, si utiliza esta ruta, su archivo seeds.db debería borrar cada tabla antes de crear entradas o usar los métodos find_or_create_by . (Sugerencia: la primera es más rápida y más confiable.) Esto evitará entradas duplicadas si carga el archivo seeds.db más de una vez.


Para cargar semillas en rspec, debe agregarlas después de la limpieza de la base de datos en confg.before (: suite) en spec_helper

config.before(:suite) do DatabaseCleaner.clean_with(:truncation) load "#{Rails.root}/db/seeds.rb" end


Prueba algo como esto

rake db:seed RAILS_ENV=test

Puede obtener una lista de todos los comandos de rake haciendo

rake -T

Si se trata de datos de prueba, le recomendamos que los ponga en dispositivos que se cargarán al inicio de las pruebas.


Sin embargo, la solución de Scott seguramente funciona para usted, creo que la mejor manera de resolver su problema es poner el código responsable de sembrar su base de datos de prueba dentro del bloque de configuración de RSpec:

Yo uso SeedFu y en mi spec_helper tengo:

RSpec.configure do |config| # some other configuration code ... config.before(:suite) do # ... SeedFu.seed # ... end # some other configuration code ... end


Terminé necesitando utilizar DatabaseCleaner para truncar la base de datos, luego cargo la tarea de rake que hace mi siembra (porque uso seedbank ). Después de eso, terminé envolviendo mis pruebas en una transacción como en el archivo_dato_cleaner README , para que cada prueba se pudiera ejecutar con un sitio recién cargado.

RSpec.configure do |config| config.before(:suite) do DatabaseCleaner.strategy = :transaction DatabaseCleaner.clean_with(:truncation) MyApplicationName::Application.load_tasks Rake::Task[''db:seed''].invoke # loading seeds end config.around(:each) do |example| DatabaseCleaner.cleaning do example.run end end end