10
私は、レールActionController::Live
モジュールを含むコントローラを持っています。私はそうFileTail
宝石を使用して読み込まれているログファイルの内容を表示する、などActionController::Live
から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
私はRspec
を使用してlive
アクションをテストしたいです。
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?
これを行う方法はありますか?たぶんどこかで見つけることができない特定のテスト方法があります。
ドキュメントに基づいて、リクエストが別のスレッド(メインスレッド以外)に移動されているように見えます。これはおそらく、次のようなものに従うことを意味します:http://stackoverflow.com/a/27383737/3109182 – Anthony