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.
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