RSpec: Wie teste ich die Rails-Logger-Nachrichtenerwartungen?
Ich versuche zu testen, ob der Rails-Logger in einigen meiner Spezifikationen Nachrichten empfängt. Ich benutze dieLogging Juwel.
Nehmen wir an, ich habe eine Klasse wie diese:
class BaseWorker
def execute
logger.info 'Starting the worker...'
end
end
Und eine Spezifikation wie:
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
Ich erhalte die folgende Fehlermeldung:
Failure/Error: logger_mock.should_receive(:info).with('Starting worker...')
(Double "Logging::Rails").info("Starting worker...")
expected: 1 time
received: 0 times
Ich habe verschiedene Ansätze ausprobiert, um die Spezifikation zu erfüllen. Das funktioniert zum Beispiel:
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
Aber eine zugängliche Instanzvariable wie diese einrichten zu müssen, scheint, als würde der Hund hier mit dem Schwanz wedeln. (Eigentlich bin ich mir nicht mal sicher, warum das Kopieren von Logger nach @log erfolgreich war.)
Was ist eine gute Lösung zum Testen der Protokollierung?