题 测试包含ActionController :: Live的控制器


我有一个包含Rails的控制器 ActionController::Live 模块。我正在显示正在使用的日志文件的内容 FileTail 宝石,并使用 SSE 从 ActionController::Live 像这样:

class LogsController < ApplicationController
  include ActionController::Live

  def live
    response.headers['Content-Type'] = 'text/event-stream'
    sse = SSE.new(response.stream, event: 'queries')
    File.open(logfile_location) do |log|
      log.extend(File::Tail)
      log.interval = 1
      log.backward(10)
      log.tail {|line| sse.write line}
    end
  rescue => e
    Rails.logger.info "Error Message:: #{e.message}"
  ensure
    sse.close
  end
end

我想测试一下 live 行动使用 Rspec。这就是我目前所拥有的:

before { get :live }
it { expect(response.headers['Content-Type']).to eq("text/event-stream") }
after {response.stream.close unless response.stream.closed? }

如果我没有这条线 after 在适当的位置,规范通过,但它只是继续监听,连接永远不会关闭,因此规格永远不会完成,你必须手动杀死它们。

如果我有 after 它有时会通过,但大多数情况下会引发异常,并且规范失败。

fatal:
   No live threads left. Deadlock?

我有办法让这项工作成功吗?也许有一种特定的方式必须进行测试,这是无法找到的。


12
2017-10-07 19:40


起源


根据文档看起来,请求被移动到一个单独的线程(在主线程之外),这意味着你可能想要遵循这样的事情: stackoverflow.com/a/27383737/3109182 - Anthony


答案: