我目前正在尝试将 Rails 3.2 应用程序升级到 Rails 4.0.13(ruby 2.3.5,PostgreSQL 9.4.13),运行集成测试时出现此错误;
: PG::UnableToSend at /companies/get_current_firm
: ===============================================
:
: > socket not open
:
:
: activerecord (4.0.13) lib/active_record/connection_adapters/postgresql_adapter.rb, line 798
: -------------------------------------------------------------------------------------------
:
: ``` ruby
: 793 end
: 794
: 795 FEATURE_NOT_SUPPORTED = "0A000" #:nodoc:
: 796
: 797 def exec_no_cache(sql, binds)
: > 798 @connection.async_exec(sql, [])
: 799 end
: 800
: 801 def exec_cache(sql, binds)
: 802 stmt_key = prepare_statement sql
: 803
: ```
此集成测试登录,然后来自前端(AngularJS)的许多调用以获取当前选择的公司等详细信息。这些调用中的每一个都会收到相同的消息,就像连接已关闭一样。我在 LIVE 模式下通过 selenium 和 capybara 使用 chrome 浏览器,所以我可以看到发生了什么。
这是我用于测试的 database.yml 文件
test: &test
adapter: postgresql
encoding: unicode
database: test_<%= ENV['USER'] %><%= ENV['TEST_ENV_NUMBER'] %>
pool: 5
username: <%= ENV['DATABASE_USER'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
这是它从前端发出的调用
AngularJS
current_firm: (scope) ->
$http({method: 'GET', url: '/companies/get_current_firm'}).success (data) ->
scope.current_firm = data['firm']
导轨控制器
def get_current_firm
render json: {firm: current_firm.organisation}
end
当用户登录时,有 3 个单独的调用来获取不同的数据,有时在测试中它会得到 1 或 2 个,但不会得到三个。
我尝试了http://www.ruby-railings.com/en/rails/postgresql/2014/01/11/connection-problems-in-rails-4.html的工作。这根本没有解决问题。
更新
当用户登录时,AngularJS 向 Rails 后端发出了三个 http 调用。如果我记下其中两个电话,那么该电话每次都有效。如果我只指出一个,所以我们有两个调用,那么它会失败一个或两个调用。我在其中一个电话上收到“待处理”消息。