Ruby on rails 使用rspec、zeus和database_cleaner处理两个不同的活动记录数据库,以未定义的方法“query_options'”结束;对于nil:NilClass错误

Ruby on rails 使用rspec、zeus和database_cleaner处理两个不同的活动记录数据库,以未定义的方法“query_options'”结束;对于nil:NilClass错误,ruby-on-rails,activerecord,zeus,database-cleaner,Ruby On Rails,Activerecord,Zeus,Database Cleaner,我想使用zeus(0.13.3)为ruby 2.0.0上的rails(3.2.11)应用程序预加载我的rails环境,并使用database_cleaner(0.9.1)清理数据库。 只要我只使用一个mysql数据库,这就可以正常工作。 在应用程序中,我们必须使用两个不同的mysql数据库。 编辑:需要提到的是,我使用了共享连接黑客,如下所述 在没有使用宙斯的情况下运行我的规格就像预期的那样工作。但如果我使用它,在创建带有错误的记录时,每个测试都会失败: undefined method `qu

我想使用zeus(0.13.3)为ruby 2.0.0上的rails(3.2.11)应用程序预加载我的rails环境,并使用database_cleaner(0.9.1)清理数据库。 只要我只使用一个mysql数据库,这就可以正常工作。 在应用程序中,我们必须使用两个不同的mysql数据库。 编辑:需要提到的是,我使用了共享连接黑客,如下所述

在没有使用宙斯的情况下运行我的规格就像预期的那样工作。但如果我使用它,在创建带有错误的记录时,每个测试都会失败:

undefined method `query_options' for nil:NilClass
如何解决这个问题

设置如下所示:

config/database.yml

test:
  database: app_test
  ...

test_second_db:
  database: other_test
  ...
在使用第二个连接的所有模型的抽象基类中

models/second_db/base.rb

module SecondDB

  class Base < ActiveRecord::Base

    establish_connection "#{Rails.env}_second_db"
    self.abstract_class = true

  end

end
编辑:


spec/support/shared_connection.rb不确定这是否能解决您的问题,因为我无法测试它,但您可能希望尝试将其添加到spec_帮助文件中

ActiveRecord::ConnectionAdapters::ConnectionPool.class_eval do
        def current_connection_id
          # Thread.current.object_id
          Thread.main.object_id
        end
end

这在测试中运行浏览器时用于Selenium。测试使用事务,浏览器是一个独立的进程,因此它看不到数据库。这可能不是问题/解决方案,但值得一试。

您可以使用
--trace
运行测试,以便我可以看到扩展的回溯吗?这可能需要深入研究一些代码。我可以通过修改@shared_connection | | retrieve_连接行以仅使用池中的一个连接来实现这一点:
@@shared_connection | | ConnectionPool::Wrapper。新建(:size=>1){retrieve_connection}
可能这是共享连接的一种替代方法。我得检查一下。
spec/support/shared_connection.rb

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end
ActiveRecord::ConnectionAdapters::ConnectionPool.class_eval do
        def current_connection_id
          # Thread.current.object_id
          Thread.main.object_id
        end
end