RSpec: ¿cómo probar las expectativas de mensajes del registrador de Rails?

Estoy tratando de probar que el registrador Rails recibe mensajes en algunas de mis especificaciones. Estoy usando elGema maderera.

Digamos que tengo una clase como esta:

class BaseWorker

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

end

Y una especificación como:

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

Recibo el siguiente mensaje de error:

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

He probado varios enfoques diferentes para obtener la especificación para pasar. Esto funciona por ejemplo:

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

Pero tener que configurar una variable de instancia accesible como esa parece que la cola está moviendo al perro aquí. (En realidad, ni siquiera estoy seguro de por qué copiar el logger a @log lo haría pasar).

¿Qué es una buena solución para probar el registro?

Respuestas a la pregunta(3)

Su respuesta a la pregunta