Подтвердить что ты не робот

Тестирование контроллера, который включает ActionController:: Live

У меня есть контроллер, который включает в себя модуль 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?

Есть ли способ сделать эту работу? Может быть, есть конкретный способ, которым это нужно протестировать, которого я не могу найти где-либо.

4b9b3361

Ответ 1

Существует прием (или другое) тестирование, а не интеграция.