How can I patch / mock logging.getlogger()
You can use patch.object()
on the actual logging object. that lets you verify that you're using the correct logger too:
logger = logging.getLogger('path.to.module.under.test')with mock.patch.object(logger, 'debug') as mock_debug: run_code_under_test() mock_debug.assert_called_once_with('Init')
Alternatively, if you're using Pytest, then it already has a fixture that captures logs for you:
def test_bar(caplog): with caplog.at_level(logging.DEBUG): run_code_under_test() assert "Init" in caplog.text # or, if you really need to check the log-level assert caplog.records[-1].message == "Init" assert caplog.records[-1].levelname == "DEBUG"
More info in the pytest docs on logging
Assuming log
is a global variable in a module mymod
, you want to mock the actual instance that getLogger
returned, which is what invokes debug
. Then, you can check if log.debug
was called with the correct argument.
with mock.patch('mymod.log') as log_mock: # test code log_mock.debug.assert_called_with('Init')
I am late for this question but another of way to achieve it is:
@patch('package_name.module_name.log')def test_log_in_A(self, mocked_log): a = A() mocked_log.debug.assert_called_once_with('Init')