2010-05-24 15 views
7

Estoy desarrollando una aplicación Rails con Rspec para pruebas unitarias.MIgrations y Rspec

Hace semanas, Rspec solía migrar la base de datos a la última versión automáticamente al ejecutar 'rake spec', pero ahora no lo hace automáticamente, tengo que implementar todo para mí.

Esto sucede en el entorno de prueba, porque mis datos de desarrollo no desaparecen.

¿Es mi culpa? No cambié nada, creo :)

Gracias de antemano.

+0

¿Tiene algún error al intentar ejecutar "rake spec"? – StevenMcD

+0

Si genero migraciones, aparece un mensaje "Tiene migraciones pendientes". En este punto, tengo que migrar la base de datos por mi cuenta y volver a ejecutar "rake spec" – pablorc

Respuesta

14

Normalmente, lo que hago es usar un comando de alias que ejecuta tanto la migración como la base de datos de prueba.

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

En su .bashrc acaba de crear un alias de comando como tal y luego ejecutar migrate_databases siempre que lo necesite.

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

. Prefiero resolver el problema en lugar de ocultarlo, pero gracias. BTW, disculpe su respuesta un mes después :) – pablorc

1

aquí está mi solución:

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 

Luego ejecutar $ run_specs rastrillo

para alguna tarea razón por defecto no sea por defecto run_specs

7

Mi solución para Rails 4:

en spec/spec_helper.rb o en cualquier lugar en las pruebas de código de inicialización ambiente:

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

UPD: Como Dorian amablemente señaló en los comentarios, no es necesario comprobar por separado si hay migraciones pendientes, porque ya ActiveRecord::Migrator.migrate lo hace detrás de las escenas. Para que pueda utilizar con eficacia solo esta línea:

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

el 'db: test: clone' ha quedado obsoleto en Rails 4.1 –

+0

Realiza dos solicitudes SQL en lugar de una sola ejecutando' ActiveRecord :: Migrator.migrate (File.join (Rails.root, 'db/migrate')) 'para el comportamiento y un código más corto. – Dorian

+1

Buen punto, @Dorian! Actualizaré la respuesta. – Hnatt

0

Vea si tiene lo siguiente en su spec_helper.rb? Cada vez que ejecuta especificaciones, RSpec comprueba si hay migraciones pendientes.

#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

Esto funciona incluso cuando Rails no está cargado y solo realiza una consulta SQL la mayor parte del tiempo.

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

Rails 4.1 hacia adelante que puede utilizar:

ActiveRecord::Migration.maintain_test_schema! 

Añadir en la parte superior de su spec_helper.rb o rails_helper.rb y ya está bueno para ir. More info here.

+0

tiene esto, y no funcionará =) –

+0

¿Me puede dar algunos detalles sobre cómo no funciona? ¿Lanza un error de algún tipo? Es posible que deba asegurarse de que sus migraciones también se ejecuten en modo dev para que funcione. – lobati

+0

Se genera un error cuando creo una nueva migración y luego ejecuto rspec –