2012-09-12 19 views
15

Başka bir posta uygulamasının da bağlandığı ikincil bir DB kullanan bir Posta Kutusu modelimiz var. Bu Şimdibirden fazla veritabanı için sınamalar ve database_cleaner

establish_connection :mail_database 

kullanılarak denir, bunu test ortamına için farklı bir bağlantı kullanır bu yüzden bir if açıklamada bu sarmak girişiminde herhalde, ama ben tercihen temiz bu veritabanını tutmak nasıl merak ediyorum 'düzenli' veritabanı için kullandığımız database_cleaner kullanarak.

Umarım birisi beni doğru yönde bükebilir.

+0

sana bir çözüm ile gelip umut: Test vadede stratejisini değiştirmek amacıyla böyle benim gözlük db_truncate => true ve ayarları: Ben meta bilgileri eklemek zorunda Geçen yıl bu konuyla uğraşıyorduk ve hundres denemesi ve hata iterasyonları aldık ve sonunda çözüm tamamen dağınık bir hackti. – fguillen

+0

@fguillen detaylara gider miydiniz? Ne yaptığını duyduğuma sevindim – HannesFostie

+0

Hatırlamak için çok zor bir dağınık hack olduğunu söylediğim gibi, şimdi projenin gerçek durumunu görüyorum ve sadece bir "test_helper.rb" yöntemi ekleyerek bittiğini görüyorum 'ModelName.destroy_all' nin bir çoğu :) – fguillen

cevap

11

Rspec (2.12.0) ile test edilen ve mysql için iki veritabanı bağlantısına sahip olan database_cleaner (0.9.1 f4b44bb) kullanan bir rails3.2.10 uygulamasına sahibim.

test: 
    ... 
    database: my_app_test 

test_my_second_connection: 
    ... 
    database: my_second_connection_test 

ikinci veritabanı bağlantısı kurmak model sınıfında bağlı:

Bunlar gibi database.yml şey ayarlanır. Ben test paketi işlemsel olmayan bazı maçlar bölümleri için kullanmak zorunda Ayrıca

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 

:

Ben manual of database_cleaner göre benim Spec/spec_helper.rb içinde dosyasını aşağıdaki ayarları kullanın başardı .

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

Bir meslektaş bunu zaten bulmuştu, ama bu gerçekten çözüm. Teşekkürler – HannesFostie

+5

Aynı durumum var (Rails 3.2.12 ve Rspec 2.14.7 üzerinde) benim modellerden birinde ikinci bir veritabanına bağlantı ile. DatabaseCleaner'ı bu şekilde kurduğumda, TÜM modellerimin ikinci veritabanına bağlanmaya çalıştığı ve tabiki işlerin başarısız olması nedeniyle tabloların ikinci bir veritabanında bulunmadığı anlaşılıyor –

+0

@ChristerFernstrom Bunu çözmede herhangi bir şans var mı? –

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 
İlgili konular