ActionCable在rspec系统规范期间引发异常

时间:2017-11-15 11:10:34

标签: ruby-on-rails ruby rspec capybara actioncable

使用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

我正在使用:

  • ruby​​ 2.4.1
  • rails 5.1.4
  • rspec 3.7.0
  • capybara 2.13.0
  • puma 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有关。

1 个答案:

答案 0 :(得分:0)

我不知道有关您测试的详细信息,但就我而言,问题出在config.log_level = :debug的{​​{1}}中。

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

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

相关问题