RSpec: как проверить ожидания сообщений от Rails logger?

Я пытаюсь проверить, что регистратор Rails получает сообщения в некоторых моих спецификациях. Я используюЖемчужина лесозаготовок.

Допустим, у меня есть такой класс:

class BaseWorker

  def execute
    logger.info 'Starting the worker...'
  end

end

И спецификации вроде:

describe BaseWorker do

  it 'should log an info message' do
    base_worker = BaseWorker.new
    logger_mock = double('Logging::Rails').as_null_object
    Logging::Rails.stub_chain(:logger, :info).and_return(logger_mock)

    logger_mock.should_receive(:info).with('Starting the worker...')
    base_worker.execute
    Logging::Rails.unstub(:logger)
  end

end

Я получаю следующее сообщение об ошибке:

 Failure/Error: logger_mock.should_receive(:info).with('Starting worker...')
   (Double "Logging::Rails").info("Starting worker...")
       expected: 1 time
       received: 0 times

Я опробовал несколько различных подходов, чтобы пройти спецификацию. Это работает, например:

class BaseWorker

  attr_accessor :log

  def initialize
    @log = logger
  end

  def execute
    @log.info 'Starting the worker...'
  end

end

describe BaseWorker do
  it 'should log an info message' do
    base_worker = BaseWorker.new
    logger_mock = double('logger')
    base_worker.log = logger_mock

    logger_mock.should_receive(:info).with('Starting the worker...')
    base_worker.execute
  end
end

Но необходимость настраивать доступную переменную экземпляра, подобную этой, кажется, что хвост здесь виляет собакой. (На самом деле, я даже не уверен, почему копирование логгера в @log сделает его успешным.)

Какое хорошее решение для тестирования регистрации?

Ответы на вопрос(3)

Ваш ответ на вопрос