2012-09-12 11 views
15

Tenemos un modelo de buzón que utiliza una base de datos secundaria a la que también se conecta otra aplicación de correo. Esto se llama usandopruebas y database_cleaner para bases de datos múltiples

establish_connection :mail_database 

Ahora, supongo que podría tratar de envolver que en una declaración if por lo que utiliza una conexión diferente para el entorno de prueba, pero me pregunto cómo pude mantener esta base de datos limpia, preferiblemente utilizando database_cleaner que ya usamos para la base de datos 'regular'.

Espero que alguien pueda empujarme en la dirección correcta.

+0

espero que llegar a una solución el año pasado estuvimos lidiando con este problema y tomó cientos de iteraciones de prueba y error, y al final la solución fue un truco completamente desordenado. – fguillen

+0

@fguillen ¿podría entrar en detalles? Feliz de escuchar cómo lo hiciste – HannesFostie

+0

Como dije, fue un truco sucio muy difícil de recordar, ahora estoy viendo el estado real del proyecto y estoy viendo que acaban de agregar un método 'test_helper.rb' con un lote de 'ModelName.destroy_all' :) – fguillen

Respuesta

11

Tengo una aplicación rails3.2.10 probada con rspec (2.12.0) y utilizando database_cleaner (0.9.1 f4b44bb) que tiene dos conexiones de base de datos para mysql.

Estos se encuentran en el database.yml algo como:

test: 
    ... 
    database: my_app_test 

test_my_second_connection: 
    ... 
    database: my_second_connection_test 

La segunda base de datos está conectada en la clase del modelo con establecer la conexión.

pude utilizar los siguientes ajustes en mi spec/spec_helper.rb archivo de acuerdo con la manual of database_cleaner:

require 'database_cleaner' 

RSpec.configure do |config| 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].clean 
    end 

end 

Además tengo que usar para algunas partes de las instalaciones del banco de pruebas no transaccionales . Así que he tenido que añadir la información meta : db_truncate => true en mi especificaciones y los ajustes como esto con el fin de cambiar la estrategia de ejecución de prueba:

config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction 
end 

config.before(:each) do 
    if example.metadata[:db_truncation] 
    DatabaseCleaner.strategy = :truncation 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :truncation 
    else 
    DatabaseCleaner.start 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].start 
    end 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].clean 
    if example.metadata[:db_truncation] 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner[:active_record,{:connection => :test_my_second_connection}].strategy = :transaction 
    end 
end 
+0

Un colega ya había encontrado esto, pero de hecho es la solución. Gracias – HannesFostie

+5

Tengo la misma situación (en Rails 3.2.12 y Rspec 2.14.7) con una conexión a una segunda base de datos en uno de mis modelos. Cuando configuro DatabaseCleaner de esta manera, parece que TODOS mis modelos intentan conectarse a la segunda base de datos, y por supuesto, las cosas fallan porque las tablas no están presentes en la segunda base de datos –

+0

@ChristerFernstrom ¿Alguna suerte para resolver eso? –

2
****set database to clean by database cleaner in rails:-**** 
config.before(:suite) do 
    DatabaseCleaner[:active_record, :connection => :test].clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner[:active_record, :connection => :test].strategy = :transaction 
end 

config.before(:each) do 
    DatabaseCleaner[:active_record, :connection => :test].start 
end 

config.after(:each) do 
    DatabaseCleaner[:active_record, :connection => :test].clean 
end 
Cuestiones relacionadas