2012-09-12 72 views
15

我們有一個郵箱模型,它使用另一個郵件應用程序也連接的輔助數據庫。這是使用多個數據庫的測試和database_cleaner

establish_connection :mail_database 

現在叫,我想我可以嘗試來包裝在if語句,因此它使用的測試環境不同的連接,但我想知道我怎麼能保持這個數據庫的清潔,最好使用我們已經用於'常規'數據庫的database_cleaner。

我希望有人能推動我朝着正確的方向前進。

+0

我希望你拿出一個解決方案去年我們正在處理這個問題,並且花了大量的嘗試和錯誤迭代,最終解決方案是一個徹頭徹尾的黑客攻擊。 – fguillen

+0

@fguillen你可以詳談嗎?很高興聽到你是如何做到的 – HannesFostie

+0

正如我所說這是一個非常難以記住的混亂的黑客,現在我看到了項目的實際狀態,我看到他們剛剛完成添加一個'test_helper.rb'方法與一個很多'ModelName.destroy_all' :) – fguillen

回答

11

我有一個rails3.2.10應用程序測試與rspec(2.12.0)和使用database_cleaner(0.9.1 f4b44bb)有兩個數據庫連接的MySQL。

test: 
    ... 
    database: my_app_test 

test_my_second_connection: 
    ... 
    database: my_second_connection_test 

第二個數據庫連接在建立連接的模型類:

這些在database.yml中類似設置。

我能夠根據manual of database_cleaner規格/ spec_helper.rb使用以下設置文件:

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 

此外,我必須要使用的測試套件非事務性燈具的某些部分。所以,我不得不添加的元信息:db_truncate =>在我的規格真實和設置像這樣,爲了改變在試運行策略:

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

一位同事已經找到了這個,但它確實是解決方案。謝謝 – HannesFostie

+5

我有同樣的情況(在Rails 3.2.12和Rspec 2.14.7上)連接到我的一個模型中的第二個數據庫。當我以這種方式設置DatabaseCleaner時,似乎我的所有模型都嘗試連接到第二個數據庫,當然事情失敗了,因爲第二個數據庫中沒有表格 –

+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