ruby-on-rails-3 - seeds - run specific seed rails
Cargue automáticamente los datos de semilla de db/seeds.rb con rastrillo (7)
Estoy usando rails-rspec
gem y tengo varias especificaciones (modelos, controladores, etc.). Cuando corro
bundle exec rake
todo es probado Sin embargo, me gustaría mejorar mis especificaciones sembrando algunos datos (de db / seeds.rb) justo después de crear la base de datos (en el entorno de prueba).
Mi archivo spec / spec_helper.rb se ve así:
ENV["RAILS_ENV"] ||= ''test''
require File.expand_path("../../config/environment", __FILE__)
require ''rspec/rails''
require ''capybara/rspec''
require ''ruby-debug''
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.mock_with :rspec
# Remove this line if you''re not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you''re not using ActiveRecord, or you''d prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = false
config.include SpecHelper
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
stub_xmpp_rest_client!
end
config.after(:each) do
DatabaseCleaner.clean
end
config.include Devise::TestHelpers, :type => :controller
config.include Delorean
config.after(:each) { back_to_the_present }
config.include Factory::Syntax::Methods
config.extend ControllerMacros, :type => :controller
end
¿Qué podría hacer la mejor manera de hacerlo? Gracias.
copie el archivo seed.rb dentro de la carpeta config / initializers.Así que el archivo seed.rb se ejecutará en el inicio del servidor.
Ejecute el siguiente comando para completar la base de datos de prueba con los datos de seed.rb
RAILS_ENV = prueba rastrillo db: semilla
¡Mala idea! Nunca, nunca, sembrar su base de datos de prueba. Use las fábricas para crear, dentro de cada prueba, solo los registros necesarios para que dicha prueba pase. La selección de la base de datos de pruebas hará que sus pruebas sean menos confiables, ya que estará haciendo muchas suposiciones que no están explícitamente establecidas en sus pruebas.
Configuré mi tarea de rake spec
para cargar automáticamente db / seeds.rb, así que dependo de eso para configurar la base de datos para una primera ejecución. Agrega esto a tu Rakefile:
task :spec => "db:seed"
task :cucumber => "db:seed"
Luego, en las ejecuciones posteriores, solo llamo a la rspec spec
directamente para omitir el paso de rspec spec
y evitar la recarga innecesaria. Configuré el limpiador de bases de datos para ignorar las tablas de semillas como esta:
RSpec.configure do |config|
config.add_setting(:seed_tables)
config.seed_tables = %w(countries roles product_types)
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation, except: config.seed_tables)
end
config.around(:each) do |example|
if example.metadata[:no_transactions]
DatabaseCleaner.strategy = :truncation, {except: config.seed_tables}
else
DatabaseCleaner.strategy = :transaction
end
DatabaseCleaner.start
example.run
DatabaseCleaner.clean
end
end
Para los escenarios que necesitan datos confirmados, puedo agregar:
describe "commit for real", use_transactions: false do
# ...
end
Esto truncará todo después de que se ejecute el ejemplo, excepto las tablas de inicialización. ¡Se asume que nunca escribes nada en las tablas de semillas! Esta es generalmente una suposición segura, ya que los datos semilla son típicamente estáticos.
Para todos los demás escenarios normales, dependo de las transacciones para revertir cualquier registro insertado. La base de datos vuelve al estado original, con los datos en las tablas de semillas intactas. Es seguro escribir en las tablas de semillas aquí si es necesario.
Para reconstruir las tablas de semillas, solo necesitas ejecutar la rake spec
nuevamente.
Creo que deberíamos usar
config.before(:each) do
Rails.application.load_seed # loading seeds
end
como antes (: todo) ejecuta el bloque una vez antes de que se ejecuten todos los ejemplos.
Entonces, si usamos before :all
, los datos de semilla se borrarán.
Dependiendo de cómo esté configurado su archivo semilla, es posible que solo pueda cargarlo / ejecutarlo desde un bloque before(:each)
o before(:all)
:
load Rails.root + "db/seeds.rb"
En Rails 4.2.0 y RSpec 3.x , así es como se ve mi rails_helper.rb.
RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
# Remove this line if you''re not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you''re not using ActiveRecord, or you''d prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, :js => true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
config.before(:all) do
Rails.application.load_seed # loading seeds
end
end
Para cargar semillas en rspec, debe agregarlo 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