Comment charger les données db: seed dans la base de données d'essai automatiquement?
j'essaie d'utiliser la nouvelle méthode standard de chargement des données de graine dans les Rails 2.3.4+, la tâche de râteau db:seed
.
je charge des données constantes, ce qui est nécessaire pour que mon application fonctionne correctement.
Quelle est la meilleure façon d'exécuter la tâche db:seed
avant les tests, de sorte que les données sont préremplies?
7 réponses
la tâche du râteau db:seed
charge principalement le script db/seeds.rb
. Par conséquent, il suffit d'exécuter ce fichier pour charger les données.
load "#{Rails.root}/db/seeds.rb"
où placer cela dépend du cadre de test que vous utilisez et si vous voulez qu'il soit chargé avant chaque test ou juste une fois au début. Vous pouvez le mettre dans un appel setup
ou dans un fichier test_helper.rb
.
je dirais que ça devrait être
namespace :db do
namespace :test do
task :prepare => :environment do
Rake::Task["db:seed"].invoke
end
end
end
parce que db: test: load n'est pas exécuté si vous avez la configuration.active_record.schema_format =: sql (db:test:clone_structure is)
mettre quelque chose comme ça dans lib/tasks/test_seed.rake devrait invoquer la tâche seed après db: test: load:
namespace :db do
namespace :test do
task :load => :environment do
Rake::Task["db:seed"].invoke
end
end
end
je crois de Steve commentaire ci-dessus devraient être la bonne réponse. Vous pouvez utiliser Rails.application.load_seed
pour charger les données seed dans votre environnement d'essai. Cependant, quand et combien de fois ces données sont chargées dépend de quelques choses:
Utilisant Minitest
il n'y a pas de moyen pratique d'exécuter ce fichier une fois avant tous les tests (voir ce numéro de Github ). Vous aurez besoin de charger les données une fois avant chaque essai, probablement dans la méthode de configuration de vos fichiers de test:
# test/models/my_model_test.rb
class LevelTest < ActiveSupport::TestCase
def setup
Rails.application.load_seed
end
# tests here...
end
Utilisant RSpec
utiliser la méthode before(:all)
de RSpec pour charger les données des semences pour tous les essais sur ce modèle:
describe MyModel do
before(:all) do
Rails.application.load_seed
end
describe "my model..." do
# your tests here
end
Espérons que cette aide.
nous invoquons db: seed en tant que partie de db:test:prepare, avec:
Rake::Task["db:seed"].invoke
de cette façon, les données de semence sont chargées une fois pour l'ensemble de l'essai, et non une fois par classe d'essai.
pour ceux qui utilisent seedbank, cela change la façon dont les graines sont chargées, donc vous ne pouvez probablement pas/ne voulez pas utiliser la solution load ...
fournie ici.
et juste mettre Rake::Task['db:seed'].invoke
dans test_helper a abouti à:
Don't know how to build task 'db:seed' (RuntimeError)
mais quand nous avons ajouté load_tasks avant cela, cela a fonctionné:
MyApp::Application.load_tasks
Rake::Task['db:seed'].invoke
ajouter Rake::Task["db:seed"].invoke
à la tâche db:test:prepare
n'a pas fonctionné pour moi. Si j'ai préparé la base de données avec rake db:test:prepare
, puis entré la console dans l'environnement de test, toutes mes graines étaient là. Cependant, les graines n'ont pas persisté entre mes essais.
ajouter load "#{Rails.root}/db/seeds.rb"
à ma méthode de configuration a bien fonctionné, cependant.
j'aimerais obtenir ces graines pour charger automatiquement et persistent, mais je n'ai pas trouvé un moyen de le faire encore!