在导入模块之前进行模拟

时间:2011-09-03 14:17:11

标签: python logging mocking patch

我在测试模块(MUT)中如何patch and mock getLogger

# Start of the module under test
import logging
log = logging.getLogger('some_logger')
# ...

我想这样做:

mock_logging.getLogger.return_value = Mock()

但是在导入MUT之前我无法创建mock_logging,但是导入MUT已经调用getLogger ...

2 个答案:

答案 0 :(得分:2)

这需要先导入模块而不先执行它,不幸的是你won't work,除非你做一些花哨的黑客攻击,比如修改模块的解析树,但你可能也不想这样做。

您可以做的是在导入后修改这些导入时引用,并通过模拟对象手动替换它们,或者在安装模拟对象后重新执行语句,但我知道,这个用途有限。 / p>

答案 1 :(得分:0)

这可以通过先导入和修补logging.getLogger来完成,然后再导入mut

import unittest
from unittest import mock

import logging
with mock.patch('logging.getLogger') as mock_method:
    import mut
mock_method.assert_called_once_with('some_logger')