我正在尝试运行验收测试,该测试使用默认的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>
正如您所看到的,在我调用共享连接方法之前,我有两个不同的数据库连接。之后,共享连接方法调用,我只有一个。
因此,任何需要使用第二个数据库连接来检索信息的测试都将失败。 :(
答案 0 :(得分:0)
为什么Capybara测试需要这个hack的问题是数据库交互是在事务中完成的,这样在测试完成后可以清理数据库。当数据在自己的事务中插入数据库时,浏览器无法看到它。
我建议用
之类的东西关闭交易 config.use_transactional_fixtures = false
这应该转到environment.rb文件,当我没错。
如果在没有事务的情况下运行测试没问题,您可以尝试其他选项来清理数据库,例如database cleaner gem。使用数据库清理器,您可以指定其他清洁选项,例如:deletion
或:truncation
(取决于测试速度更快)。