2012-09-12 10 views
15

私たちは、別のメールアプリケーションも接続するセカンダリDBを使用するメールボックスモデルを持っています。これは今複数のデータベースのテストとdatabase_cleaner

establish_connection :mail_database 

使用して呼び出され、私はそれをテスト環境用に異なる接続を使用していますので、私はif文でそれをラップしようとする可能性がありと仮定し、私は私が好ましく、クリーンなこのデータベースを維持する可能性がどのように思ったんだけど「通常の」データベースですでに使用しているdatabase_cleanerを使用しています。

私は誰かが正しい方向に私を振ることができることを願っています。

+0

私はあなたが解決策を考え出す願っています:テスト実行中に戦略を変更するために、このような私のスペックでdb_truncate =>真と設定:だから私は、メタ情報を追加する必要がありました昨年私たちはこの問題に取り組んでいました。試行錯誤の繰り返しがあり、最終的には完全に乱雑なハックでした。 – fguillen

+0

@fguillen詳細に行くことができますか?あなたがそれをしたことを聞いてうれしく思います。 – HannesFostie

+0

私が言ったように、それは覚えにくい難解なハックでした。今、私はプロジェクトの実際の状態を見ていて、 'test_helper.rb'メソッドを多くの 'ModelName.destroy_all' :) – fguillen

答えて

11

私はrspec(2.12.0)とmysqlの2つのデータベース接続を持つdatabase_cleaner(0.9.1 f4b44bb)を使ってrails3.2.10アプリケーションをテストしました。

これらは同様database.ymlの何かに設定されています

test: 
    ... 
    database: my_app_test 

test_my_second_connection: 
    ... 
    database: my_second_connection_test 

第二のデータベースを確立する接続でモデルクラスに接続されています。

私は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 

を。

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)で、私のモデルの2番目のデータベースに接続しています。 DatabaseCleanerをこのようにセットアップすると、すべてのモデルが2番目のデータベースに接続しようとしているように見えます。もちろん、2番目のデータベースにテーブルが存在しないために失敗します。 –

+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 
関連する問題