web-dev-qa-db-fra.com

Comment charger db: semences de données dans la base de test automatiquement?

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?

115
Luke Francl

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.

116
ryanb

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)

84
Eugene Bolshakov

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
17
Nick M

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:

Utiliser Minitest

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

Utiliser RSpec

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.

13
Matt

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
3
Gary S. Weaver

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.

3
jondahl

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!

2
alexpls