Como carregar o db: dados de semente no database de teste automaticamente?

Eu estou tentando usar a nova maneira padrão de carregar dados de semente no Rails 2.3.4+, a tarefa de ancinho de db:seed .

Estou carregando dados constantes, o que é necessário para que meu aplicativo funcione corretamente.

Qual é a melhor maneira de executar a tarefa db:seed antes dos testes, para que os dados sejam pré-preenchidos?

    A tarefa db:seed rake basicamente carrega apenas o script db/seeds.rb . Portanto, basta executar esse arquivo para carregar os dados.

     load "#{Rails.root}/db/seeds.rb" 

    Onde colocar isso depende de qual framework de testes você está usando e se você quer que ele seja carregado antes de cada teste ou apenas uma vez no começo. Você poderia colocá-lo em uma chamada de setup ou em um arquivo test_helper.rb .

    Eu diria que deveria ser

     namespace :db do namespace :test do task :prepare => :environment do Rake::Task["db:seed"].invoke end end end 

    Porque db: test: load não é executado se você tiver config.active_record.schema_format =: sql (db: test: clone_structure)

    Colocar algo assim em lib / tasks / test_seed.rake deve invocar a tarefa seed após db: test: load:

     namespace :db do namespace :test do task :load => :environment do Rake::Task["db:seed"].invoke end end end 

    Eu acredito que o comentário de Steve acima deveria ser a resposta correta. Você pode usar o Rails.application.load_seed para carregar dados iniciais em seu ambiente de teste. No entanto, quando e com que frequência esses dados são carregados depende de algumas coisas:

    Usando o Minitest

    Não existe uma maneira conveniente de executar esse arquivo uma vez antes de todos os testes (veja essa questão do Github ). Você precisará carregar os dados uma vez antes de cada teste, provavelmente no método de configuração dos seus arquivos de teste:

     # test/models/my_model_test.rb class LevelTest < ActiveSupport::TestCase def setup Rails.application.load_seed end # tests here... end 

    Usando o RSpec

    Use o método before(:all) do RSpec para carregar dados iniciais para todos os testes deste modelo:

     describe MyModel do before(:all) do Rails.application.load_seed end describe "my model..." do # your tests here end 

    Espero que isto ajude.

    Estamos chamando db: seed como parte do db: test: prepare, com:

    Rake::Task["db:seed"].invoke

    Dessa forma, os dados iniciais são carregados uma vez para toda a execução do teste e não uma vez por class de teste.

    Para aqueles que usam o banco de sementes, ele altera como as sementes são carregadas, então você provavelmente não pode / não quer usar a load ... solução fornecida aqui.

    E apenas colocando Rake::Task['db:seed'].invoke em test_helper resultou em:

     Don't know how to build task 'db:seed' (RuntimeError) 

    Mas quando adicionamos load_tasks antes disso, funcionou:

     MyApp::Application.load_tasks Rake::Task['db:seed'].invoke 

    Adicionando Rake::Task["db:seed"].invoke para o db:test:prepare rake task não funcionou para mim. Se eu preparasse o database com o rake db:test:prepare e depois entrasse no console dentro do ambiente de teste, todas as minhas sementes estavam lá. No entanto, as sementes não persistiram entre os meus testes.

    Adicionar load "#{Rails.root}/db/seeds.rb" ao meu método setup funcionou bem.

    Eu adoraria que essas sementes fossem carregadas automaticamente e persistissem, mas ainda não encontrei uma maneira de fazer isso!