Sto provando a verificare che il registratore di Rails riceva messaggi in alcune delle mie specifiche. Sto usando il Logging gem.RSpec: come testare le aspettative dei messaggi del registratore di Rails?
Diciamo che ho una classe come questa:
class BaseWorker
def execute
logger.info 'Starting the worker...'
end
end
E una specifica come:
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
ottengo il seguente messaggio di errore:
Failure/Error: logger_mock.should_receive(:info).with('Starting worker...')
(Double "Logging::Rails").info("Starting worker...")
expected: 1 time
received: 0 times
ho ho provato diversi approcci per far passare le specifiche. Questo funziona per esempio:
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
Ma avere per impostare una variabile di istanza accessibile come quella sembra la coda è agita il cane qui. (In realtà, non sono nemmeno sicuro del motivo per cui copiare il logger su @log lo farebbe passare.)
Qual è una buona soluzione per testare il logging?
Questa domanda è sorta più volte su SO, si veda ad esempio [qui] (http://stackoverflow.com/questions/153234/how-deep-are-your-test-tests) e [qui] (http: //stackoverflow.com/questions/1168151/unit-testing-logging-and-dependency-injection) e il consenso generale era che non testare la registrazione a meno che non si tratti di un requisito di progetto. –
Arte, grazie per il commento. Ho letto quelli. Questa potrebbe essere la risposta definitiva. – keruilin