Estou tentando usar a nova maneira padrão de carregar dados de propagação no Rails 2.3.4+, a db:seed
tarefa rake.
Estou carregando dados constantes, necessários para que meu aplicativo realmente funcione corretamente.
Qual é a melhor maneira de executar a db:seed
tarefa antes dos testes, para que os dados sejam preenchidos previamente?
ruby-on-rails
testing
seed
Luke Francl
fonte
fonte
test_helper.rb
não funcionou para mim, apesar do stackoverflow.com/a/1998520/68210 .Rails.application.load_seed
logo abaixorequire 'rspec/rails'
no meu arquivo rails_helper. Se você estiver usando database_cleaner jóia - ela vai exigir um pouco de ajustes para se certificar de que você não perca seus dados de sementes depois de cada teste e você pode descobrir que na documentação da gema autotest/test_helper.rb
após a existenterequire 'rails/test_help'
linhaEu diria que deveria ser
Como o db: test: load não será executado se você tiver config.active_record.schema_format =: sql (db: test: clone_structure is)
fonte
--trace
ajudou-me a entender como isso funciona.task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
antesRake::Task["db:seed"].invoke
db:seed
é executado édevelopment
... estranhamente.Colocar algo parecido com isto em lib / tasks / test_seed.rake deve chamar a tarefa seed após db: test: load:
fonte
Acredito que o comentário de Steve acima deve ser a resposta correta. Você pode usar
Rails.application.load_seed
para carregar dados de sementes no 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 há uma maneira conveniente de executar esse arquivo uma vez antes de todos os testes (consulte este problema no Github ). Você precisará carregar os dados uma vez antes de cada teste, provavelmente no método de configuração dos seus arquivos de teste:
Usando o RSpec
Use o
before(:all)
método do RSpec para carregar dados iniciais para todos os testes deste modelo:Espero que isto ajude.
fonte
before(:suite)
vez debefore(:all)
. Publicou uma resposta separada para incluir código formatado.Estamos invocando db: seed como parte do db: test: prepare, com:
Rake::Task["db:seed"].invoke
Dessa forma, os dados iniciais são carregados uma vez durante toda a execução do teste e não uma vez por classe de teste.
fonte
Para aqueles que usam o banco de sementes, isso altera a maneira como as sementes são carregadas, portanto você provavelmente não pode / não deseja usar a
load ...
solução fornecida aqui.E apenas colocar
Rake::Task['db:seed'].invoke
test_helper resultou em:Mas quando adicionamos load_tasks antes disso, funcionou:
fonte
Adicionando
Rake::Task["db:seed"].invoke
àdb:test:prepare
tarefa rake não funcionou para mim. Se eu preparei o banco de dadosrake db:test:prepare
e entrei no console no ambiente de teste, todas as minhas sementes estavam lá. No entanto, as sementes não persistiram entre os meus testes.Adicionando
load "#{Rails.root}/db/seeds.rb"
ao meu método de instalação funcionou bem, no entanto.Gostaria muito que essas sementes carregassem automaticamente e persistissem, mas ainda não encontrei uma maneira de fazer isso!
fonte
Com base na resposta de Matt, se você seguir esse tipo de rota, recomendo chamar
Rails.application.load_seed
umbefore(:suite)
bloco emrspec_helper.rb
vez de umbefore(:all)
bloco em qualquer arquivo. Dessa forma, o código de propagação é chamado apenas uma vez para todo o conjunto de testes e não uma vez para cada grupo de testes.rspec_helper.rb:
fonte