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
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
@fguillen ¿podría entrar en detalles? Feliz de escuchar cómo lo hiciste – HannesFostie
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