web-dev-qa-db-fra.com

Avec RSpec, comment amorcer la base de données en charge?

J'utilise rspec pour tester w my Rails 3 app. J'ai besoin d'amorcer la base de données avant le début des tests. Comment puis-je amorcer la base de données avec les éléments suivants:

/ db/seeds.rb

["Admin", "Member"].each do |role_name|
  Role.find_or_create_by_name(role_name)
end

Merci

39
AnApprentice

Essayez quelque chose comme ça

rake db:seed Rails_ENV=test

Vous pouvez obtenir une liste de toutes les commandes de râteau exécutées

rake -T

S'il s'agit de données de test, vous voudrez peut-être envisager de les mettre dans des appareils qui seront chargés au début des tests.

10
Scott

Dans spec_helper.rb ou Rails_helper.rb:

RSpec.configure do |config|
  config.before(:suite) do
    Rails.application.load_seed # loading seeds
  end
end
164
Hannes

Cependant, la solution de Scott fonctionne sûrement pour vous, je pense que la meilleure façon de résoudre votre problème était de placer le code responsable de l'amorçage de votre base de données de test dans le bloc de configuration de RSpec:

J'utilise SeedFu et dans mon spec_helper j'ai:

RSpec.configure do |config|

  # some other configuration code ...

  config.before(:suite) do
    # ...
    SeedFu.seed
    # ...
  end

  # some other configuration code ...

end
22
Michał Czapko

J'ai suivi le débat qui fait rage sur Charger automatiquement les données de graine de db/seeds.rb avec rake . Les inconditionnels soutiennent que vous ne devriez jamais charger de données de semences pour les tests, mais je prends la position plus modérée qu'il y a des occasions où vous voudrez peut-être charger des données de semences pour des tests spécifiques , par exemple vérifier que les données de départ existent.

Contrairement à certaines réponses données ici, je ne recommande pas de charger inconditionnellement les graines depuis l'intérieur de votre fichier spec_helper. Au lieu de cela, vous pouvez charger vos graines à l'aide de before :each ou before :all à l'intérieur uniquement des fichiers de test qui ont besoin des graines, par exemple:

describe "db seed tests" do
  before(:each) do
    load "#{Rails.root}/db/seeds.rb" 
  end

  ...your test code here...
end

mettre à jour

Comme le souligne @marzapower, si vous suivez cette voie, votre fichier seeds.db doit effacer chaque table avant de créer des entrées ou utiliser find_or_create_by méthodes. (Conseil: le premier est plus rapide et plus fiable.) Cela évitera les entrées en double si vous chargez le fichier seeds.db plusieurs fois.

11
fearless_fool

Pour charger des graines dans rspec, vous devez l'ajouter après le nettoyage de la base de données dans config.before (: suite) dans spec_helper

config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load Rails.root.join('db', 'seeds.rb')
end
7
Ahmad Hussain

J'ai fini par avoir besoin d'utiliser DatabaseCleaner pour tronquer la base de données, puis charger la tâche de râteau qui effectue mon amorçage (car j'utilise seedbank ). Après cela, j'ai fini par encapsuler mes tests dans une transaction comme sur le database_cleaner README , afin que chaque test puisse s'exécuter avec un site fraîchement chargé.

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