Auto-charger les données de graines de db/seeds.rb avec râteau
j'utilise rails-rspec
gem et j'ai plusieurs spécifications (modèles, contrôleurs, etc). Quand je cours:
bundle exec rake
tout est testé. Cependant, je voudrais améliorer mes spécifications en semant quelques données (à partir de db / seeds.rb) juste après la création de la base de données (dans l'environnement de test).
Mon spec/spec_helper.rb.le fichier rb ressemble à ceci:
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
Que pourrait faire le meilleur moyen de le faire? Grâce.
7 réponses
selon la façon dont votre fichier seed est configuré, vous pourriez juste être en mesure de le charger / l'exécuter à partir d'un bloc before(:each)
ou before(:all)
:
load Rails.root + "db/seeds.rb"
mauvaise idée! Ne jamais, jamais, semer votre base de données de test. Utiliser des usines pour créer, à l'intérieur de chaque essai, seulement les enregistrements nécessaires pour que cet essai soit réussi. L'ensemencement de la base de données de test rendra vos tests moins fiables, parce que vous ferez beaucoup d'hypothèses qui ne sont pas explicitement énoncées dans vos tests.
j'ai mis en place ma tâche rake spec
pour charger automatiquement db/seeds.rb, donc je compte sur ça pour configurer la base de données pour une première exécution. Ajoutez ceci à votre Rakefile:
task :spec => "db:seed"
task :cucumber => "db:seed"
ensuite, sur les passages suivants, j'appelle juste rspec spec
directement pour sauter l'étape de graine et éviter le rechargement inutile. Je configure database cleaner pour ignorer les tables seed comme ceci:
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
pour les scénarios qui ont besoin de données engagées, je peux ajouter:
describe "commit for real", use_transactions: false do
# ...
end
cela tronquera tout après les passages de l'exemple, sauf les tables de semences. il est supposé que vous n'écrivez jamais rien aux tables de semences! il s'agit généralement d'une hypothèse sûre, étant donné que les données sur les semences sont généralement statiques.
pour tous les autres scénarios normaux, je dépends des transactions pour faire reculer les enregistrements insérés. La base de données est retournée à l'état original, les données dans les tables seed étant intactes. C'est d'écrire pour la postérité tables ici si vous en avez besoin.
pour reconstruire les tables de semences, Vous avez juste besoin d'exécuter rake spec
à nouveau.
pour charger les graines dans rspec vous devez l'ajouter après le nettoyage de la base de données dans confg.avant(:suite) spec_helper
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
load "#{Rails.root}/db/seeds.rb"
end
dans Rails 4.2.0 et RSpec 3.x , voici comment mon rails_helper.rb semble.
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
-
copiez la graine.fichier rb dans le dossier config/initializers.Donc graine.le fichier rb sera exécuté au démarrage du serveur.
-
exécutez la commande ci-dessous pour remplir le test db avec la graine.données rb
RAILS_ENV=test rake db: seed
je pense qu'on devrait utiliser
config.before(:each) do
Rails.application.load_seed # loading seeds
end
comme avant(:all) exécute le bloc une fois tous les exemples sont exécutés.
donc si nous utilisons before :all
, les données de la graine seront effacées.