2011-09-29 10 views
8

Tengo el siguiente archivo spec_helper.rb en mi aplicación Rails 3.1. Estoy usando Spork para cargar el entorno más rápido para las pruebas. Todas mis pruebas funcionaron antes de agregar Spork a la mezcla. Después de agregar spork, la base de datos de prueba no se borraba correctamente entre las ejecuciones de prueba, lo que descartó algunas de mis expectativas.Spork, RSpec y database_cleaner destruyendo la base de datos de desarrollo

Siguiendo otras instrucciones, agregué database_cleaner a la mezcla con el siguiente código; sin embargo, ahora, la base de datos de desarrollo se está limpiando, así como también la base de datos de prueba. La llamada ENV ["RAILS_ENV"] devuelve la prueba durante esta llamada.

¿Hay alguna manera de limitar explícitamente la llamada a DatabaseCleaner.clean_with (: truncamiento) para que solo afecte a la base de datos de prueba?

require 'rubygems' 
require 'spork' 

Spork.prefork do 
    ENV["RAILS_ENV"] ||= 'test' 
    require File.expand_path("../../config/environment", __FILE__) 
    require 'rspec/rails' 
    require 'shoulda/matchers/integrations/rspec' 
    require 'database_cleaner' 

    Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

    RSpec.configure do |config| 
    config.mock_with :mocha 

    config.formatter = 'documentation' 
    config.use_transactional_fixtures = true 

    config.before(:suite) do 
     DatabaseCleaner.strategy = :truncation 
    end 

    config.before(:each) do 
     DatabaseCleaner.start 
    end 

    config.after(:each) do 
     DatabaseCleaner.clean 
    end 
    end 
end 

Spork.each_run do 
    FactoryGirl.reload 
end 

Actualización: Aquí está mi archivo database.yml

development: 
    adapter: sqlite3 
    database: db/development.sqlite3 
    pool: 5 
    timeout: 5000 

test: 
    adapter: sqlite3 
    database: db/test.sqlite3 
    pool: 5 
    timeout: 5000 

production: 
    adapter: sqlite3 
    database: db/production.sqlite3 
    pool: 5 
    timeout: 5000 

Además, he trabajado en todo el problema básico moviendo la llamada clean_with en el antes (: cada uno) sección, pero esto ralentiza la prueba funciona de manera significativa.

+0

¿cuál es su 'database.yml'? – Bohdan

+0

Actualicé la pregunta para incluir la información –

+2

También enfrento el mismo problema, actualmente uso 'RAILS_ENV = paquete de prueba exec rake spec' para evitar que esto suceda. – subosito

Respuesta

3

¿Ha intentado mover ENV["RAILS_ENV"] ||= 'test' fuera del bloque Spork.prefork?

¿Estás seguro de que Spork causó que tu DB se haya ido a limpiar? Si está utilizando dispositivos transaccionales de RSpec, lo único que podría conducir a tal cosa es usar fábricas dentro del bloque before(:all). Puede limpiar los datos en el bloque after(:all) y deshacerse de DatabaseCleaner.

Por cierto, si está utilizando la estrategia de truncamiento, no es necesario ejecutar DatabaseCleaner.start.

1

¿Está su RAILS_ENV explícitamente configurado en "desarrollo"? Si es así, el valor predeterminado de spec_helper ejecutará las pruebas contra el DB de desarrollo. Si ejecuta una prueba desde dentro de vim, o ejecuta rspec en la línea de comandos, ejecutará la prueba en su BD de desarrollo.

Cuando me veo obligado a utilizar database_cleaner, me gusta establecer explícitamente RAILS_ENV para probar en spec_helper para proteger mi DB de desarrollo. Cada vez que utilice algo que no sean accesorios transaccionales, esta es probablemente una buena idea.

Noto que está utilizando dispositivos transaccionales y limpiador de base de datos. No necesita database_cleaner en absoluto si su DB admite transacciones. Si está utilizando Mongo, o está ejecutando pruebas de capybara-webkit, necesitará database_cleaner y querrá deshabilitar los dispositivos transaccionales.

Cuestiones relacionadas