关于使用Spork运行规范的“PGError:没有连接到服务器”

时间:2011-07-17 02:06:56

标签: ruby-on-rails rspec spork

我正在使用Ruby 1.9.2,Rails 3.1,Rspec,Postgres和Spork,但我无法让它们在一起玩得很好。

第一次运行规范(Spork在后台运行)运行正常。但是,当我第二次运行规范时,它失败了:

Failure/Error: Unable to find matching line from backtrace
 PGError:
   no connection to the server
 # /Users/tom/.rvm/gems/ruby-1.9.2-p180@grapi/gems/activerecord-3.1.0.rc4/lib/active_record/connection_adapters/postgresql_adapter.rb:272:in `exec'
etc....

任何提示赞赏!

5 个答案:

答案 0 :(得分:8)

您可能也启用了Devise。

此处描述了您的问题:https://github.com/sporkrb/spork/wiki/Spork.trap_method-Jujutsu 更具体地说,对于rails 3.1:https://gist.github.com/1054078

spec_helper.rb env.rb中的prefork块的开头应如下所示:

Spork.prefork do
  Spork.trap_method(Rails::Application, :reload_routes!)
  Spork.trap_method(Rails::Application::RoutesReloader, :reload!)
...
祝你好运!

答案 1 :(得分:3)

如果您正在使用Factory Girl,请不要使用'factory_girl_rails'宝石,只需使用'factory_girl'。

Spork.each_run do
  FactoryGirl.definition_file_paths = [
    File.join(Rails.root, 'spec', 'factories')
  ]
  FactoryGirl.find_definitions
end

对于使用Factory Girl,Machinist或Shoulda Matchers的任何人,请务必阅读Spork的trap_method:https://github.com/timcharper/spork/wiki/Spork.trap_method-Jujutsu

它解决了我在测试时使用Spork和删除的PostgreSQL连接的问题。

答案 2 :(得分:0)

你必须运行spork --bootstrap

并在将一些配置插入spec_helper.rb文件后,spork会知道您的rails配置。

使用RSpec时,可以尝试将以下代码添加到spec_helper文件中:

require 'rubygems'
require 'spork'

Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true

    # Needed for Spork
    ActiveSupport::Dependencies.clear
  end
end

Spork.each_run do
  load "#{Rails.root}/config/routes.rb"
  Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
end

答案 3 :(得分:0)

您可以尝试将其添加到Spork.each_run回调并检查它是否解决了问题?

ActiveRecord::Base.connection_pool.verify_active_connections!

答案 4 :(得分:0)

我阅读了https://github.com/timcharper/spork/wiki/Spork.trap_method-Jujutsu上的说明并找到了以下内容。

在我的情况下,解决方案是改变机械师蓝图的加载​​方式。我的prefork块有这条线:

Spork.prefork do
  ...
  require Rails.root.join 'spec/support/blueprints'
  ...

我从prefork块中删除了它,而是将此行添加到each_run:

Spork.each_run do
  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
  ...

两条线基本上做同样的事情,所以主要的事情是不要在prefork中加载蓝图,而是在each_run中加载。

希望它有所帮助!