2016-10-07 11 views
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? 

これを行う方法はありますか?たぶんどこかで見つけることができない特定のテスト方法があります。

+0

ドキュメントに基づいて、リクエストが別のスレッド(メインスレッド以外)に移動されているように見えます。これはおそらく、次のようなものに従うことを意味します:http://stackoverflow.com/a/27383737/3109182 – Anthony

答えて

0

アクセプタンス(またはその他の)テストがあり、統合ではありません。

関連する問題