Конечно, мы могли бы издеваться над многими вещами, но простая перефакторизация тестируемого класса, добавление config и log сделает жизнь намного проще.
def __init__(self, cfg='/config/program.cfg', log='/var/log/info_server.log'):
На сервере разработки, где /config/program.cfg
нет, вы можете просто
TheClass(cfg='~/dev.cfg', log='/tmp/dev.log')
self.server_obj.connect_redis() log_mock.logger.info.assert_called_with('Started Redis instance')
не работать
import logging
logging.getLogger
# <function getLogger at 0x7f3d2ed427b8>
logger = logging.getLogger()
type(logger)
# <class 'logging.RootLogger'>
logger.info
# <bound method Logger.info of <RootLogger root (WARNING)>>
Патч должен выглядеть примерно так:
with mock.patch.object(logging.RootLogger, 'info') as mock_info:
server_obj = Server(cfg='sth', log='sth')
mock_info.assert_called_with('xxx')