デフォルトの Capybara ドライバーを使用して Web ブラウザーでのユーザーの動作をシミュレートする受け入れテストを実行しようとしています。私が作成した受け入れテストには、外部データベースへの接続が必要です。受け入れテストを実行すると、外部データベースに接続して必要な情報を取得する必要がある時点で失敗することに気付きました。
複数のデータベース接続を認識できるように Capybara を設定するにはどうすればよいですか?
Jose Valim のソリューションを読んで、Capybara にローカル データベースを認識させました。
class ActiveRecord::Base
mattr_accessor :shared_connection
@@shared_connection = nil
def self.connection
@@shared_connection || retrieve_connection
end
end
# Forces all threads to share the same connection. This works on
# Capybara because it starts the web server in a thread.
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
このアプローチの問題は、確立した他のすべてのデータベース接続をオーバーライドすることです (ここでは、ActiveRecord::Base から継承する別のデータベース接続 FirstDatabase::Record を使用しています)。
puts "First Record cxn: #{FirstDatabase::Record.connection}"
# => First Record cxn: #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xe59b524>
puts "AR Base cxn: #{ActiveRecord::Base.connection}"
# => AR Base cxn: #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xc52761c>
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
puts "First Record cxn: #{FirstDatabase::Record.connection}"
# => First Record cxn: #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xc52761c>
puts "AR Base cxn: #{ActiveRecord::Base.connection}"
# => AR Base cxn: #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xc52761c>
ご覧のとおり、共有接続メソッドを呼び出す前に、2 つの異なるデータベース接続があります。共有接続メソッド呼び出しの後、1 つしかありません。
そのため、2 番目のデータベース接続を使用して情報を取得する必要があるテストはすべて失敗します。:(