Estoy tratando de probar que el registrador Rails recibe mensajes en algunas de mis especificaciones. Estoy usando el Logging gem.RSpec: cómo probar las expectativas del mensaje del registrador de rieles?
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
me sale 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
tengo 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 así parece que la cola mueve al perro aquí. (En realidad, ni siquiera estoy seguro de por qué copiar el registrador a @log lo haría pasar.)
¿Cuál es una buena solución para probar el registro?
Esa pregunta surgió varias veces en SO, ver por ejemplo [aquí] (http://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests) y [aquí] (http: //stackoverflow.com/questions/1168151/unit-testing-logging-and-dependency-injection) y el consenso general fue que no prueba el registro a menos que sea un requisito del proyecto. –
Arte, gracias por el comentario. Yo leí esos. Esa puede ser la respuesta final. – keruilin