как использовать заморозку в бортовом журнале

Я пытаюсь запустить тесты, которые включают насмешку над датой и временем в журнале (для логики вокруг logbook.TimedRotatingFileHandler). Но фризган не доходит до бортового журнала. Журналы печатаются как текущее (без насмешек, правильное) текущее время!

мой пример печатает запутанное сообщение

[2019-07-09 22:01:21.583288] INFO: None: test time: 2000-01-01 00:01:00

для следующего pytest

from freezegun import freeze_time
import logbook
import sys
import datetime as dt

def test_logbook():
    faketime = freeze_time('2000-01-01 00:01')
    faketime.start()
    assert dt.datetime.now().strftime('%Y%d%m') == '20000101'
    log = logbook.Logger()
    log.handlers.append(logbook.StreamHandler(sys.stdout))
    log.info('test time: ' + str(dt.datetime.now()))
    faketime.stop()
    assert 0

person Will    schedule 09.07.2019    source источник


Ответы (1)


Вы замораживаете время после импорта logbook, не покрывая часть инициализации на уровне модуля. Переместите импорт внутрь области с замороженным временем; пример:

from freezegun import freeze_time
import sys
import datetime as dt

def test_logbook(capsys):
    with freeze_time('2000-01-01 00:01'):
        import logbook
        assert dt.datetime.now().strftime('%Y%d%m') == '20000101'
        log = logbook.Logger()
        log.handlers.append(logbook.StreamHandler(sys.stdout))
        log.info('hello world')
    assert capsys.readouterr().out == '[2000-01-01 00:01:00.000000] INFO: None: hello world\n'
person hoefling    schedule 10.07.2019
comment
Потрясающие! если я запускаю этот тест с параметром --noconftest, он проходит. Мой configtest.py импортирует файл (с функциями, которые я тестирую), который импортирует журнал, поэтому я не думаю, что смогу получить Fezetime перед импортом. Может быть, это другой вопрос. Также спасибо за капсы. не знал об этом! - person Will; 10.07.2019
comment
Рад, что смог помочь! Глобальное замораживание времени может быть действительно сложной задачей, а иногда даже требует динамического импорта (через importlib), но, безусловно, выполнимо. Обычно я определяю и запускаю глобальную заморозку в хуке pytest_configure и перемещаю все затронутые импорты, такие как datetime, внутрь приспособлений/хуков, затем останавливаю заморозку в pytest_unconfigure. Если вы опубликуете минимально воспроизводимый пример в новом вопросе, я буду рад помочь. - person hoefling; 10.07.2019