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
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.
Dans spec_helper.rb ou Rails_helper.rb:
RSpec.configure do |config|
config.before(:suite) do
Rails.application.load_seed # loading seeds
end
end
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
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
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.
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
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