Rails 4: Como redefinir o banco de dados de teste?

87

Estou no Rails 4 e percebi que alguns de meus testes RSpec estão falhando porque algumas de minhas refatorações de teste usam um filtro anterior (provavelmente por causa de transações). Esta postagem descreve um problema semelhante:

O banco de dados de teste do Rails não limpa após algumas execuções

Em vez de usar a gem DatabaseCleaner, existe um comando rake para limpar o banco de dados de teste? Eu acredito que rake db:test:prepareestá obsoleto no Rails 4. Além disso, se antes de transações como

post :create, user: Fabricate.attributes_for(:user)

são persistentes. Existe uma forma alternativa de refatoração para evitar a necessidade de limpar manualmente o banco de dados de teste?

Solomons_Ecclesiastes
fonte

Respostas:

120

Uma solução exagerada seria:

bundle exec rake db:drop RAILS_ENV=test
bundle exec rake db:create RAILS_ENV=test
bundle exec rake db:schema:load RAILS_ENV=test

Você poderia fazer tudo isso em uma tarefa de rake e executá-la.

Outra solução a partir daqui é incluir o seguinte seu spec_helper.rbarquivo

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

Isenção de responsabilidade: Eu não testei isso e você deve ler o post do SO , pois pode não funcionar em todas as situações.

Dito isso, eu recomendaria usar a jóia do limpador de banco de dados para evitar situações como essa.

ChrisBarthol
fonte
1
Os primeiros 3 rake db: * podem ser substituídos apenas pelo último, pois ele exclui todas as tabelas e as cria a partir do esquema.
Konole de
2
para Rails 5, use em ApplicationRecordvez de ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo Ludke
3
Use rake db:structure:loadse estiver usando structure.sql em vez de schema.rb.
Archonic
2
Um liner mais puro para o acima é simplesmente:RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
stwr667
98

Pode ser:

bundle exec rake db:reset RAILS_ENV=test
mpz
fonte
20
Percebo que também funciona rake db:seed ... o que pode ou não ser um problema
Harry Wood
1
Caso você esteja usando Rails 5, o comando agora é rails em vez de rake:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández
15

Às vezes, pode ser necessário executar este comando (opcional)

rails db:environment:set RAILS_ENV=test

Mas, com certeza, limpar seu banco de dados de teste deve ser tão fácil quanto:

rails db:drop db:create db:migrate RAILS_ENV=test

d1jhoni1b
fonte
2

Você pode adicionar um filtro posterior, excluindo todas as entradas das tabelas em questão.

nbirla
fonte
0

Em teoria, isso ActiveRecord::Migration.maintain_test_schema!deve funcionar. Coloque dentrorails_helper.rb

ao Sr
fonte
0

Acabei escrevendo uma tarefa simples de rake que descarta / migra (ou descarta e migra) todos os bancos de dados de teste e desenvolvimento, dependendo do comando executado.

Inclui a funcionalidade para perguntar ao usuário se deseja continuar quando ocorre um erro e usa o método popen3 do Open3 (de modo que possamos acessar stdin, stdout e stderr; e quaisquer comandos com falha não resultam no processo da tarefa rake abortando (ao contrário de quando usar o sistema )).

Espero que isso ajude alguém. :)

https://github.com/xtrasimplicity/rake_all_db_helper/

editar: No entanto, isso precisará ser executado manualmente a partir de seu shell, sempre que desejar limpar seu banco de dados.

XtraSimplicity
fonte