我正在尝试运行使用默认 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
这种方法的问题是它覆盖了我建立的所有其他数据库连接(这里,我有另一个数据库连接 FirstDatabase::Record 继承自 ActiveRecord::Base):
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>
如您所见,在调用共享连接方法之前,我有两个不同的数据库连接。之后,共享连接方法调用,我只有一个。
因此,任何需要使用第二个数据库连接来检索信息的测试都将失败。:(