我想測試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