为什么不为Rspec + Selenium使用共享的ActiveRecord连接?

Rya*_*yan 46 ruby rspec ruby-on-rails capybara

似乎最常被接受的处理Selenium和测试的方法是避免使用事务夹具,然后在测试/场景之间使用像database_cleaner这样的东西.我最近遇到了以下文章,建议执行以下操作:

spec_helper.rb

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
Run Code Online (Sandbox Code Playgroud)

对于性能而言,这似乎比替代品更好.有没有人有理由不这样做?

hsg*_*ert 33

实际上它有问题.例如,如果您使用gem mysql2,您将开始看到一些错误,例如:

Mysql2::Error This connection is still waiting for a result
Run Code Online (Sandbox Code Playgroud)

请改用它.它由迈克·佩勒姆(Mike Perham)撰写,全部归功于他.

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

  def self.connection
    @@shared_connection || ConnectionPool::Wrapper.new(:size => 1) { retrieve_connection }
  end
end

ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
Run Code Online (Sandbox Code Playgroud)

你也需要安装gem connection_pool.这将使您免于许多麻烦.

  • http://www.spacevatican.org/2012/8/18/threading-the-rat/解释了为什么这样做. (3认同)
  • 链接到Mike Perham的原始要点:https://gist.github.com/mperham/3049152 (2认同)

nmo*_*ott 15

这个解决方案由Jose Valim编写 - 在Rails社区中受到尊重,并且是Rails核心团队的成员.如果有问题,我怀疑他会建议使用它.我个人没有任何问题.

请注意,如果您使用Spork,则需要在each_run块中才能工作.

FWIW - 我在Postgres上有上述补丁的间歇性水豚测试问题.@hsgubert下面的Mike Perham解决方案似乎解决了这些问题.我现在使用那个解决方案.

  • 这不是一个真正的答案,而是对权威的诉求. (14认同)