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.

20
demandé sur Zag zag.. 2011-12-05 18:15:00

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" 
29
répondu Taryn East 2013-12-03 14:45:44

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.

44
répondu Marnen Laibow-Koser 2011-12-05 14:53:04

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.

12
répondu Andrew Vit 2012-09-28 01:01:24

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
7
répondu Ahmad Hussain 2013-11-07 07:15:33

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
7
répondu Andrew Lobban 2015-03-03 17:18:08
  1. copiez la graine.fichier rb dans le dossier config/initializers.Donc graine.le fichier rb sera exécuté au démarrage du serveur.

  2. exécutez la commande ci-dessous pour remplir le test db avec la graine.données rb

    RAILS_ENV=test rake db: seed

0
répondu vidur punj 2017-12-05 14:37:03

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.

-1
répondu Yang 2017-05-23 10:30:58