RSpec: como testar as expectativas de mensagens do logger do Rails?
Eu estou tentando testar que o logger Rails recebe mensagens em algumas das minhas especificações. Estou usando oJóia de registro.
Digamos que eu tenha uma aula assim:
class BaseWorker
def execute
logger.info 'Starting the worker...'
end
end
E uma especificação 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
Eu recebo a seguinte mensagem de falha:
Failure/Error: logger_mock.should_receive(:info).with('Starting worker...')
(Double "Logging::Rails").info("Starting worker...")
expected: 1 time
received: 0 times
Eu tentei várias abordagens diferentes para obter a especificação para passar. Isso funciona por exemplo:
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
Mas ter que configurar uma variável de instância acessível como essa parece que a cauda está abanando o cachorro aqui. (Na verdade, eu nem sei ao certo por que copiar logger para @log faria isso passar).
O que é uma boa solução para testar o registro?