2012-09-12 16 views
15

Abbiamo un modello di mailbox che utilizza un DB secondario a cui si collega anche un'altra app di posta. Questo si chiama utilizzandotest e database_cleaner per più database

establish_connection :mail_database 

Ora, suppongo che avrei potuto tentare di avvolgere che in una dichiarazione if in modo che utilizza una connessione diversa per l'ambiente di test, ma mi chiedo come ho potuto mantenere questo database pulito, di preferenza usando database_cleaner che già usiamo per il database 'regolare'.

Spero che qualcuno mi può spingere nella giusta direzione.

+0

Spero si arriva con una soluzione l'anno scorso ci siamo occupati di questo problema e ci sono volute centinaia di tentativi e iterazioni di errore, e alla fine la soluzione era un hack completamente disordinato. – fguillen

+0

@ fguillen potresti entrare nei dettagli? Felice di sentire come lo hai fatto – HannesFostie

+0

Come ho detto è stato un disordinato trucco molto difficile da ricordare, ora sto vedendo lo stato attuale del progetto e sto vedendo che hanno appena finito di aggiungere un metodo 'test_helper.rb' con un molto di 'ModelName.destroy_all' :) – fguillen

risposta

11

Ho un'applicazione rails3.2.10 testata con rspec (2.12.0) e utilizzando database_cleaner (0.9.1 f4b44bb) con due connessioni database per mysql.

Questi sono situati nel database.yml qualcosa di simile:

test: 
    ... 
    database: my_app_test 

test_my_second_connection: 
    ... 
    database: my_second_connection_test 

La seconda banca dati è collegato in classe del modello con stabilire la connessione.

sono stato in grado di utilizzare le seguenti impostazioni nel mio spec/spec_helper.rb file in base al 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 

Inoltre devo usare per alcune parti della suite di test di infissi non transazionali . Così ho dovuto aggiungere le informazioni meta : db_truncate => true nelle mie specifiche e le impostazioni come questo, al fine di cambiare la strategia in prova:

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 collega l'aveva già trovato, ma è davvero la soluzione. Grazie – HannesFostie

+5

Ho la stessa situazione (su Rails 3.2.12 e Rspec 2.14.7) con una connessione a un secondo database in uno dei miei modelli. Quando imposto DatabaseCleaner in questo modo sembra che TUTTI i miei modelli tentino di connettersi al secondo database e, naturalmente, le cose falliscono perché le tabelle non sono presenti nel secondo database –

+0

@ChristerFernstrom. –

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 
Problemi correlati