2010-05-24 12 views
7

Sto sviluppando un'applicazione Rails con Rspec per il test dell'unità.MIgrations e Rspec

settimane fa, Rspec utilizzato per migrare il database all'ultima versione automaticamente quando si esegue 'rake spec', ma ora non lo fa automaticamente, devo implementare tutto per me stesso.

Questo succede nell'ambiente di test, perché i miei dati di sviluppo non scompaiono.

È colpa mia? Non ho cambiato nulla, penso :)

Grazie in anticipo.

+0

si verificano errori quando si tenta di eseguire "rake spec"? – StevenMcD

+0

Se si generano migrazioni, viene generato un "In attesa di migrazioni in sospeso". A questo punto devo migrare il database da solo, e rieseguire "rake spec" – pablorc

risposta

14

In genere quello che faccio è utilizzare un comando alias che esegue sia la migrazione che prepara il database di test.

rake db:migrate && rake db:test:prepare 

Nel vostro .bashrc basta creare un comando alias in questo modo e quindi eseguire migrate_databases ogni volta che è necessario.

alias migrate_databases='rake db:migrate && rake db:test:prepare' 
+0

Preferisco risolvere il problema invece di nasconderlo, ma grazie. BTW, scusa per la risposta un mese più tardi :) – pablorc

1

Ecco la mia soluzione:

Rakefile:

require File.expand_path('../config/application', __FILE__) 
require 'rake' 
require "rspec/core/rake_task" 

MyApp::Application.load_tasks 

desc "Run specs" 
RSpec::Core::RakeTask.new(:spec) 

task :run_specs => ['db:test:clone', :spec] do 

end 

task :default => :run_specs 

Poi ho eseguito $ run_specs rastrello

per qualche compito ragione di default non default run_specs

7

mio soluzione per Rails 4:

.210

in spec/spec_helper.rb o in qualsiasi parte del codice di test ambiente di inizializzazione:

# Automigrate if needs migration 
if ActiveRecord::Migrator.needs_migration? 
    ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate')) 
end 

UPD: Mentre Dorian gentilmente sottolineato nei commenti, non è necessario controllare separatamente, se ci sono le migrazioni pendenti, perché ActiveRecord::Migrator.migrate già fa questo dietro le quinte. Quindi puoi utilizzare efficacemente solo questa riga:

ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate')) 
+0

il 'db: test: clone' è deprecato in Rails 4.1 –

+0

Si eseguono due richieste SQL invece di una sola eseguendo' ActiveRecord :: Migrator.migrate (File.join (Rails.root, 'db/migrate')) 'per il comportamento e un codice più breve. – Dorian

+1

Buon punto, @Dorian! Aggiornerò la risposta – Hnatt

0

Vedi se hai il seguente nel tuo spec_helper.rb? Ogni volta che si eseguono le specifiche, RSpec controlla se ci sono migrazioni in sospeso.

#Checks for pending migrations before tests are run. 
#If you are not using ActiveRecord, you can remove this line. 
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) 
0

Questo funziona anche quando Rails non è caricato e fa solo una query SQL per la maggior parte del tempo.

if defined?(ActiveRecord::Migrator) 
    ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db', 'migrate')) 
end 
5

Rails 4.1 in avanti è possibile utilizzare:

ActiveRecord::Migration.maintain_test_schema! 

Aggiungi nella parte superiore del vostro spec_helper.rb o rails_helper.rb e sei a posto. More info here.

+0

hanno questo, e non funzionerà =) –

+0

Puoi darmi qualche dettaglio su come non funziona? Fa un errore di qualche tipo? Potrebbe essere necessario assicurarsi che le migrazioni vengano eseguite anche in modalità dev affinché funzioni. – lobati

+0

Genera errore quando creo una nuova migrazione e quindi eseguo rspec –