Я пытаюсь проверить, что регистратор Rails получает сообщения в некоторых моих спецификациях. Я использую Logging gem.RSpec: как тестировать ожидания сообщений журнала 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 пропустит его.)
Какое хорошее решение для проверки регистрации?
Этот вопрос возникал несколько раз на SO, см. Например [здесь] (http://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests) и [здесь] (http: //stackoverflow.com/questions/1168151/unit-testing-logging-and-dependency-injection), и общий консенсус заключался в том, что вы не проверяете ведение журнала, если это не требование к проекту. –
Искусство, спасибо за комментарий. Я читал их. Это может быть окончательный ответ. – keruilin