У меня есть контроллер, который включает в себя модуль Rails ActionController::Live
. Я показываю содержимое файла журнала, которое читается с помощью FileTail
gem, и используя SSE
from 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?
Есть ли способ сделать эту работу? Может быть, есть конкретный способ, которым это нужно протестировать, которого я не могу найти где-либо.