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