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?

113
demandé sur Luke Francl 2009-10-16 00:21:40

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 .

113
répondu ryanb 2009-10-15 20:31:39

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)

82
répondu Eugene Bolshakov 2010-01-04 09:52:55

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
18
répondu Nick M 2009-12-01 22:52:48

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.

7
répondu Matt 2017-05-23 12:02:40

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.

3
répondu jondahl 2009-10-15 22:07:36

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
3
répondu Gary S. Weaver 2014-02-17 22:06:02

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!

2
répondu alexpls 2012-09-19 02:59:50