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