Ich versuche zu testen, dass der Rails-Logger Nachrichten in einigen meiner Spezifikationen empfängt. Ich benutze die Logging gem.RSpec: wie Rails Logger Nachricht Erwartungen zu testen?
Lasst uns sagen, dass ich eine Klasse wie dieses:
class BaseWorker
def execute
logger.info 'Starting the worker...'
end
end
Und eine spec 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
erhalte ich die Meldung nach dem Ausfall:
Failure/Error: logger_mock.should_receive(:info).with('Starting worker...')
(Double "Logging::Rails").info("Starting worker...")
expected: 1 time
received: 0 times
Ich habe habe verschiedene Ansätze ausprobiert, um die Spezifikation zu bestehen. Das funktioniert zum Beispiel:
Aber eine zugängliche Instanzvariable wie diese einzurichten, scheint so, als würde der Schwanz hier mit dem Hund wedeln. (Eigentlich bin ich nicht einmal sicher, warum das Kopieren von Logger zu @log würde es passieren.)
Was ist eine gute Lösung für das Testen der Protokollierung?
Diese Frage auf SO mehrmals hat ergeben, siehe zum Beispiel [hier] (http://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests) und [hier] (http: //stackoverflow.com/questions/1168151/unit-testing-logging-and-dependency-injection) und der allgemeine Konsens war, dass Sie nicht die Protokollierung testen, es sei denn es eine Projektanforderung ist. –
Art, danke für den Kommentar. Ich habe diese gelesen. Das könnte die ultimative Antwort sein. – keruilin