J'essaie d'utiliser la nouvelle méthode standard de chargement des données de départ dans Rails 2.3.4+, la db:seed
tâche rake.
Je charge des données constantes, nécessaires au bon fonctionnement de mon application.
Quelle est la meilleure façon d' db:seed
exécuter la tâche avant les tests, afin que les données soient préremplies?
ruby-on-rails
testing
seed
Luc Francl
la source
la source
test_helper.rb
n'a pas fonctionné pour moi bien que stackoverflow.com/a/1998520/68210 l'ait fait.Rails.application.load_seed
juste en dessousrequire 'rspec/rails'
dans mon fichier rails_helper. Si vous utilisez la gemme database_cleaner - il faudra quelques ajustements pour vous assurer de ne pas perdre vos données de départ après chaque test et vous pouvez le trouver dans la documentation de la gemme elle-mêmetest/test_helper.rb
après larequire 'rails/test_help'
ligne existanteJe dirais que ça devrait être
Parce que db: test: load n'est pas exécuté si vous avez config.active_record.schema_format =: sql (db: test: clone_structure is)
la source
--trace
m'a aidé à comprendre comment cela fonctionne.task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
avantRake::Task["db:seed"].invoke
db:seed
exécution estdevelopment
... bizarre.Mettre quelque chose comme ça dans lib / tasks / test_seed.rake devrait appeler la tâche d'amorçage après db: test: load:
la source
Je crois que le commentaire de Steve ci-dessus devrait être la bonne réponse. Vous pouvez utiliser
Rails.application.load_seed
pour charger des données d'amorçage dans votre environnement de test. Cependant, le moment et la fréquence de chargement de ces données dépendent de plusieurs facteurs:Utilisation de Minitest
Il n'y a pas de moyen pratique d'exécuter ce fichier une fois avant tous les tests (voir ce problème Github ). Vous devrez charger les données une fois avant chaque test, probablement dans la méthode de configuration de vos fichiers de test:
Utilisation de RSpec
Utilisez la
before(:all)
méthode de RSpec pour charger les données de départ pour tous les tests de ce modèle:J'espère que cela t'aides.
la source
before(:suite)
lieu debefore(:all)
. Publié une réponse distincte pour inclure le code formaté.Nous invoquons db: seed dans le cadre de db: test: prepare, avec:
Rake::Task["db:seed"].invoke
De cette façon, les données de départ sont chargées une fois pendant toute la durée du test, et non une fois par classe de test.
la source
Pour ceux qui utilisent la banque de graines, cela change la façon dont les graines sont chargées, donc vous ne pouvez / ne voulez probablement pas utiliser la
load ...
solution fournie ici.Et simplement mettre
Rake::Task['db:seed'].invoke
dans test_helper a abouti à:Mais quand nous avons ajouté load_tasks avant cela, cela fonctionnait:
la source
L'ajout
Rake::Task["db:seed"].invoke
de ladb:test:prepare
tâche de râteau n'a pas fonctionné pour moi. Si j'ai préparé la base de données avecrake db:test:prepare
, puis entré dans la console dans l'environnement de test, toutes mes graines étaient là. Cependant, les graines n'ont pas persisté entre mes tests.L'ajout
load "#{Rails.root}/db/seeds.rb"
à ma méthode de configuration a bien fonctionné, cependant.J'adorerais que ces graines se chargent automatiquement et persistent, mais je n'ai pas encore trouvé de moyen de le faire!
la source
S'appuyant sur la réponse de Matt, si vous empruntez ce genre de route, je recommande d'appeler
Rails.application.load_seed
unbefore(:suite)
blocrspec_helper.rb
plutôt que dans unbefore(:all)
bloc dans n'importe quel fichier. De cette façon, le code d'amorçage est appelé une seule fois pour toute la suite de tests plutôt qu'une fois pour chaque groupe de tests.rspec_helper.rb:
la source