2016-10-07 45 views
10

Mam kontroler, który zawiera szyn modułowych ActionController::Live. Ja wyświetlając zawartość pliku dziennika, który jest odczytywany za pomocą FileTail gem, a przy użyciu SSE z ActionController::Live tak:Testowanie kontroler, który zawiera 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 

Chcę przetestować działanie live użyciu Rspec. To, co obecnie mam:

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

jeśli nie mam linię z after na miejscu, przechodzi Spec ale po prostu utrzymuje się na słuchaniu, a połączenie nie jest zamknięty, stąd specyfikacje i nigdy nie skończyć musisz je zabić ręcznie.

Jeśli mam linię after, przechodzi ona czasami, ale w większości przypadków zgłasza wyjątek, a specyfikacja kończy się niepowodzeniem.

fatal: 
    No live threads left. Deadlock? 

Czy jest sposób, w jaki mogę wykonać tę pracę? Być może istnieje specyficzny sposób, w jaki należy to przetestować, czego nie jestem w stanie znaleźć nigdzie.

+0

podstawie docs wygląda na to żądanie jest przeniesione do osobnego wątku (off głównego wątku), co oznacza, że ​​prawdopodobnie chcesz śledzić coś takiego: http://stackoverflow.com/a/27383737/3109182 – Anthony

Odpowiedz

0

Jest akceptacja (lub inny) testowanie, nie integracja.