Comment charger db:graine de données dans la base de données de test automatiquement?
Je suis d'essayer d'utiliser la nouvelle norme de chargement de graines de données dans les Rails 2.3.4+, le db:seed
tâche rake.
Je suis le chargement des données constantes, ce qui est nécessaire pour que ma demande vraiment fonctionner correctement.
Quelle est la meilleure façon d'obtenir le db:seed
tâche à exécuter avant le début des épreuves, de sorte que les données est pré-rempli?
Vous devez vous connecter pour publier un commentaire.
La
db:seed
tâche rake principalement juste des charges de ladb/seeds.rb
script. Par conséquent, exécutez simplement le fichier à charger les données.Où placer cela dépend de ce qu'un framework de test que vous utilisez et si vous voulez qu'il soit chargé avant chaque test ou juste une fois au début. Vous pourriez le mettre dans un
setup
appel ou dans untest_helper.rb
fichier.test_helper.rb
n'a pas fonctionné pour moi, même si stackoverflow.com/a/1998520/68210 n'.Rails.application.load_seed
droit, en vertu derequire 'rspec/rails'
dans mon rails_helper fichier. Si vous utilisez database_cleaner gem - il faudra un peu de peaufinage pour vous assurer de ne pas perdre vos données semences après chaque test, et vous pouvez la trouver dans la documentation de la pierre elle-mêmetest/test_helper.rb
après l'require 'rails/test_help'
ligneJe dirais qu'il devrait être
Parce db:essai:la charge n'est pas exécuté si vous avez des config.active_record.schema_format = :sql (db:test:clone_structure est)
--trace
m'a aidé à comprendre comment cela fonctionne.rake db:test:prepare task
a terminé, c'est l'approche gagnante pour moi.task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
avantRake::Task["db:seed"].invoke
db:seed
pistes estdevelopment
... bizarrement.development
quandseeds.rb
s'exécute. (Rails 3.2.13 au moins)Mettre quelque chose comme ceci dans lib/tasks/test_seed.râteau doit invoquer la graine tâche après db:test:charge:
Je crois Steve commentaire ci-dessus devraient être la bonne réponse. Vous pouvez utiliser
Rails.application.load_seed
à la charge de la graine de données dans votre environnement de test. Cependant, quand et à quelle fréquence ces données sont chargées dépend de peu de choses:À L'Aide De Minitest
Il n'existe pas de moyen pratique pour exécuter ce fichier une fois avant que tous les tests (voir cette question Github). Vous aurez besoin de charger les données une fois avant chaque test, probablement dans la méthode de configuration de vos fichiers de test:
À L'Aide De RSpec
Utilisation de RSpec
before(:all)
méthode pour charger des semences de données pour tous les test pour ce modèle:Espère que cette aide.
Nous sommes en invoquant db:graine comme une partie de la db:test:préparer, avec:
Rake::Task["db:seed"].invoke
De cette façon, la graine de données est chargée qu'une seule fois pour l'ensemble de l'essai, et pas une fois par classe de test.
Pour les personnes à l'aide de bancs de sable, il change la façon dont les graines sont chargés, de sorte que vous ne pouvez probablement pas/ne souhaitez pas utiliser le
load ...
solution fournie ici.Et juste mettre
Rake::Task['db:seed'].invoke
en test_helper abouti à:Mais lorsque nous avons ajouté load_tasks avant cela, il a travaillé:
Ajoutant
Rake::Task["db:seed"].invoke
à ladb:test:prepare
tâche rake n'a pas de travail pour moi. Si j'ai préparé la base de données avecrake db:test:prepare
, puis entra dans la console à l'intérieur de l'environnement de test, toutes mes graines étaient là. Cependant, les graines n'ont pas persisté entre mes tests.Ajoutant
load "#{Rails.root}/db/seeds.rb"
à ma méthode d'installation a bien fonctionné, même si.J'aimerais obtenir ces graines pour charger automatiquement et persistent, mais je n'ai pas trouvé un moyen de le faire encore!