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

这种方法的问题是它覆盖了我建立的所有其他数据库连接(这里,我有另一个数据库连接 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>

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

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

4

1 回答 1

0

Capybara 测试需要这种 hack 的问题是数据库交互是在事务中完成的,因此可以在测试完成后清理数据库。并且由于数据是在自己的事务中插入到数据库中的,因此浏览器无法看到它。

我建议用类似的东西关闭交易

    config.use_transactional_fixtures = false

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

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

于 2013-07-29T08:09:03.837 回答