with specific seeds run rails ruby-on-rails-3 testing rspec rake

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.


  1. copie el archivo seed.rb dentro de la carpeta config / initializers.Así que el archivo seed.rb se ejecutará en el inicio del servidor.

  2. 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