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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage