如何使用需要连接到多个数据库的Capybara驱动程序运行测试?

时间:2013-07-26 19:00:49

标签: ruby-on-rails activerecord capybara

我正在尝试运行验收测试,该测试使用默认的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>

正如您所看到的,在我调用共享连接方法之前,我有两个不同的数据库连接。之后,共享连接方法调用,我只有一个。

因此,任何需要使用第二个数据库连接来检索信息的测试都将失败。 :(

1 个答案:

答案 0 :(得分:0)

为什么Capybara测试需要这个hack的问题是数据库交互是在事务中完成的,这样在测试完成后可以清理数据库。当数据在自己的事务中插入数据库时​​,浏览器无法看到它。

我建议用

之类的东西关闭交易
    config.use_transactional_fixtures = false

这应该转到environment.rb文件,当我没错。

如果在没有事务的情况下运行测试没问题,您可以尝试其他选项来清理数据库,例如database cleaner gem。使用数据库清理器,您可以指定其他清洁选项,例如:deletion:truncation(取决于测试速度更快)。