Próbuję przetestować, czy program rejestrujący Railsy odbiera wiadomości w niektórych moich specyfikacjach. Używam Logging gem.RSpec: w jaki sposób przetestować oczekiwanie na komunikat Logger Rails?
Załóżmy, że mam klasy jak poniżej:
class BaseWorker
def execute
logger.info 'Starting the worker...'
end
end
oraz specyfikację jak:
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
pojawia się następujący komunikat o awarii:
Failure/Error: logger_mock.should_receive(:info).with('Starting worker...')
(Double "Logging::Rails").info("Starting worker...")
expected: 1 time
received: 0 times
mam wypróbował kilka różnych podejść, aby uzyskać specyfikację. Działa to na przykład:
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
Ale ustawienie takiej dostępnej zmiennej instancji wygląda na to, że ogon macha tu psem. (Właściwie to nie jestem nawet pewien, dlaczego skopiowanie logger'a do @log sprawi, że przejdzie.)
Co jest dobrym rozwiązaniem do testowania rejestrowania?
To pytanie pojawiło się kilka razy na SO, zobacz na przykład [tutaj] (http://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests) i [tutaj] (http: //stackoverflow.com/questions/1168151/unit-testing-logging-and-dependency-injection) i ogólnie uważano, że nie testuje się rejestrowania, chyba że jest to wymóg projektu. –
Sztuka, dzięki za komentarz. Czytałem te. To może być ostateczna odpowiedź. – keruilin