我在使用Capybara的系统规格中使用ActionCable时遇到问题。 ActionCable在我的开发服务器上可以正常运行,但是在按照系统规格进行测试时,它无法连接到Websockets。

/log/test.log的输出显示:

Started GET "/cable" for 127.0.0.1 at 2017-11-15 18:17:04 +0900
Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-11-15 18:17:04 +0900
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
WebSocket error occurred: undefined method `write_nonblock' for nil:NilClass
WebSocket error occurred: undefined method `write_nonblock' for nil:NilClass
WebSocket error occurred: undefined method `write_nonblock' for nil:NilClass


我正在使用:


红宝石2.4.1
导轨5.1.4
RSpec 3.7.0
水豚2.13.0
彪马3.10.0
selenium-webdriver 3.6.0


我努力了:

Capybara.server = :puma


这没有什么区别(可能是因为系统规格已经在使用Puma)。

我尝试调试问题:

仔细观察错误,在write_nonblock上调用方法nil,这发生在第45行:

https://github.com/rails/rails/blob/385825fb705446a1f11e82b65ca97a50d7e67898/actioncable/lib/action_cable/connection/stream.rb#L45

似乎@rack_hijack_io设置为nil,这很可能在以下hijack_rack_socket方法中发生:

https://github.com/rails/rails/blob/385825fb705446a1f11e82b65ca97a50d7e67898/actioncable/lib/action_cable/connection/stream.rb#L102

@socket_object.env["rack.hijack_io"]返回nil,所以我们没有"rack.hijack_io"键。因此该错误似乎与Rack Hijacking API有关。

最佳答案

我不知道有关您测试的详细信息,但就我而言,问题出在config.log_level = :debug中的config/environments/[env]中。

因为ActionCable会产生许多有关广播的调试信息。例如,如果您有100个已连接的客户端,则每次广播的日志文件都会被100条消息污染。

PS:我在使用Stackdriver Logging的NGINX + Passenger(6.0.4)+ GKE上捕获了此错误。

10-07 17:07