2

デフォルトの 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 番目のデータベース接続を使用して情報を取得する必要があるテストはすべて失敗します。:(

4

1 に答える 1

0

カピバラのテストにこのハックが必要な理由は、データベースとのやり取りがトランザクションで行われるため、テストの終了後にデータベースを消去できることです。また、データは独自のトランザクションでデータベースに挿入されるため、ブラウザからは見えません。

次のようなものでトランザクションをオフにすることをお勧めします

    config.use_transactional_fixtures = false

私が間違っていない場合、これは environment.rb ファイルに移動する必要があります。

トランザクションなしで実行したときにテストが問題ない場合は、データベース クリーナー gemなど、データベースをクリーンアップするための他のオプションを試すことができます。:deletionデータベースクリーナーを使用すると、またはなどの他のクリーニングオプションを指定できます:truncation(テストでどちらが高速かによって異なります)。

于 2013-07-29T08:09:03.837 に答える