13

ActionController::LiveRailsモジュールを含むコントローラーがあります。FileTailgem を使用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?

これを機能させる方法はありますか?おそらく、これをテストする必要がある特定の方法があり、どこにも見つけることができません。

4

1 に答える 1