58 votes

Avec RSpec, comment ensemencer la base de données à la charge ?

J'utilise rspec pour tester mon application rails 3. J'ai besoin d'ensemencer la base de données avant le début des tests. Comment puis-je ensemencer la base de données avec ce qui suit :

/db/seeds.rb

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

Gracias

214voto

Hannes Points 338

Dans spec_helper.rb ou rails_helper.rb :

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

24voto

Michał Czapko Points 1898

Cependant, la solution de Scott vous convient certainement, mais je pense que la meilleure façon de résoudre votre problème est de placer le code responsable de l'ensemencement de votre base de données de test dans le bloc configure 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

12voto

fearless_fool Points 9190

J'ai suivi le débat qui fait rage sur le site de Chargement automatique des données des graines à partir de db/seeds.rb avec rake . Les irréductibles maintiennent qu'il ne faut jamais charger de données d'amorçage pour les tests, mais j'adopte une position plus modérée, à savoir qu'il y a des occasions où l'on peut vouloir charger des données d'amorçage. pour des tests spécifiques par exemple en vérifiant que les données de base existent.

Contrairement à certaines réponses données ici, je ne no recommande de charger inconditionnellement les graines à partir de votre fichier spec_helper. Au lieu de cela, vous pouvez charger vos graines en utilisant before :each o before :all à l'intérieur seulement 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

mise à jour

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

12voto

Scott Points 585

Essayez, quelque chose comme ça

rake db:seed RAILS_ENV=test

Vous pouvez obtenir une liste de toutes les commandes de rake en faisant

rake -T

S'il s'agit de données de test, vous pouvez envisager de les placer dans des fichiers fixes qui seront chargés au début des tests.

10voto

Ahmad Hussain Points 801

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X