Rails 4: come resettare il database di test?


88

Sono su Rails 4 e ho notato che alcuni dei miei test RSpec hanno esito negativo perché alcuni dei miei refactoring di test utilizzano un filtro before (presumibilmente a causa delle transazioni). Questo post descrive un problema simile:

Il database di test di rails non si cancella dopo alcune esecuzioni

Invece di usare la gemma DatabaseCleaner, esiste un comando rake per cancellare il database di prova? Credo che rake db:test:preparesia deprecato in Rails 4. Inoltre, se prima di transazioni come

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

sono persistenti. Esiste un modo alternativo di refactoring per evitare la necessità di svuotare manualmente il database di test?

Risposte:


121

Una soluzione eccessiva sarebbe:

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

Potresti fare tutto questo in un'attività di rake ed eseguirlo.

Un'altra soluzione da qui è includere quanto segue nel tuo spec_helper.rbfile

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

Disclaimer: non l'ho testato e dovresti leggere il post SO in quanto potrebbe non funzionare in tutte le situazioni.

Detto questo, consiglierei di utilizzare la gemma di pulizia del database per evitare situazioni come questa.


1
I primi 3 rake db: * possono essere sostituiti solo con l'ultimo in quanto cancella tutte le tabelle e le crea dallo schema.
konole

2
per Rails 5, usa ApplicationRecordinvece di ActiveRecord::Base blog.bigbinary.com/2015/12/28/…
Yo Ludke

3
Da usare rake db:structure:loadse stai usando structure.sql invece di schema.rb.
Archonic

2
Una linea più RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
ordinata

98

Può essere:

bundle exec rake db:reset RAILS_ENV=test

21
Noto che funziona anche rake db:seed ... il che potrebbe o non potrebbe essere un problema
Harry Wood,

1
Nel caso in cui tu stia utilizzando Rails 5, il comando ora è rails invece di rake:bundle exec rails db:reset RAILS_ENV=test
Uriel Hernández

19

A volte potrebbe essere necessario eseguire questo comando (opzionale)

rails db:environment:set RAILS_ENV=test

Ma di sicuro cancellare il tuo database di test dovrebbe essere facile come:

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


2

È possibile aggiungere un filtro dopo l'eliminazione di tutte le voci dalle tabelle interessate.


0

In teoria questo ActiveRecord::Migration.maintain_test_schema!dovrebbe fare il trucco. Metterlo inrails_helper.rb


0

Ho finito per scrivere una semplice attività di rake che elimina / migra (o elimina e migra) tutti i database di test e sviluppo, a seconda del comando eseguito.

Include funzionalità per chiedere all'utente se desidera continuare quando si verifica un errore e utilizza il metodo popen3 di Open3 (in modo tale che possiamo accedere a stdin, stdout e stderr; e qualsiasi comando fallito non risulta nel processo dell'attività rake interruzione (a differenza di quando si utilizza il sistema )).

Si spera che questo aiuti qualcuno. :)

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

modifica: questo dovrà essere eseguito manualmente dalla tua shell, ogni volta che desideri cancellare il tuo database, comunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.