J'essaie d'utiliser la nouvelle méthode standard de chargement des données de base dans Rails 2.3.4+, le db:seed
tâche de rake.
Je charge des données constantes, indispensables au bon fonctionnement de mon application.
Quel est le meilleur moyen d’obtenir le db:seed
tâche à exécuter avant les tests, afin que les données soient pré-remplies?
Le db:seed
La tâche de rake charge principalement le db/seeds.rb
script. Par conséquent, exécutez simplement ce fichier pour charger les données.
load "#{Rails.root}/db/seeds.rb"
# or
Rails.application.load_seed
Cela dépend du framework de test que vous utilisez et si vous souhaitez le charger avant chaque test ou juste une fois au début. Vous pouvez le mettre dans un appel setup
ou dans un test_helper.rb
fichier.
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 config.active_record.schema_format =: sql (db: test: clone_structure is)
Mettre quelque chose comme ceci dans lib/tasks/test_seed.rake devrait appeler la tâche source après la base de données: test: load:
namespace :db do
namespace :test do
task :load => :environment do
Rake::Task["db:seed"].invoke
end
end
end
Je crois que commentaire de Steve ci-dessus devrait être la bonne réponse. Vous pouvez utiliser Rails.application.load_seed
Pour charger des données de base dans votre environnement de test. Cependant, le moment et la fréquence de chargement de ces données dépendent de plusieurs facteurs:
Il n’existe aucun moyen pratique d’exécuter ce fichier une fois avant tous les tests (voir question de Github ). Vous devrez charger les données une fois avant chaque test, probablement dans la méthode d'installation 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
Utilisez la méthode _pour before(:all)
de RSpec pour charger les données de départ pour tous les tests de ce modèle:
describe MyModel do
before(:all) do
Rails.application.load_seed
end
describe "my model..." do
# your tests here
end
J'espère que cela t'aides.
Pour ceux qui utilisent seedbank, cela change la façon dont les graines sont chargées, vous ne pouvez donc probablement pas/ne voulez pas utiliser le fichier load ...
solution fournie ici.
Et juste en mettant Rake::Task['db:seed'].invoke
dans test_helper a abouti à:
Don't know how to build task 'db:seed' (RuntimeError)
Mais lorsque nous avons ajouté load_tasks avant cela, cela fonctionnait:
MyApp::Application.load_tasks
Rake::Task['db:seed'].invoke
Nous appelons 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 pour l'ensemble du test et non pas une fois par classe de test.
Ajouter Rake::Task["db:seed"].invoke
au db:test:prepare
La tâche de ratissage n'a pas fonctionné pour moi. Si j'ai préparé la base de données avec rake db:test:prepare
, et ensuite entré dans la console dans l'environnement de test, toutes mes graines étaient là. Cependant, les semences n'ont pas persisté entre mes tests.
Ajouter load "#{Rails.root}/db/seeds.rb"
à ma méthode de configuration a bien fonctionné, cependant.
J'aimerais beaucoup que ces graines se chargent automatiquement et persistent, mais je n'ai pas encore trouvé le moyen de le faire!