将 rspec、zeus 和 database_cleaner 与两个不同的active_record数据库一起使用,以未定义的方法 'query_options' 结束,对于 nil:NilCl



我想使用zeus(0.13.3)预加载我的rails环境为rails(3.2.11)应用程序在ruby 2.0.0和使用database_cleaner(0.9.1)来清理数据库。这是工作很好,如果我只使用一个mysql数据库。在应用程序中,我们必须使用两个不同的mysql数据库。编辑:需要提到的是,我使用共享连接hack,在这里描述。

在没有使用zeus的情况下运行我的specs像预期的那样工作。但是,如果我使用它,每个测试都失败的时刻,当一个记录被创建的错误:

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_helper。

spec/spec_helper.rb
require 'database_cleaner'
RSpec.configure do |config|
  config.use_transactional_fixtures = false
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner[:active_record,{:connection => :test_second_db}].strategy = :transaction
  end
  config.before(:each) do
    DatabaseCleaner.start
    DatabaseCleaner[:active_record,{:connection => :test_second_db}].start
  end
  config.after(:each) do
    DatabaseCleaner.clean
    DatabaseCleaner[:active_record,{:connection => :test_second_db}].clean
  end
end

编辑:

spec/support/shared_connection.rb
class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil
  def self.connection
    @@shared_connection || retrieve_connection
  end
end

规范/支持/shared_connection.rb

不确定这是否会解决您的问题,因为我无法测试它,但您可能想尝试将其添加到您的spec_helper文件。

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

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

相关内容

最新更新