在导入模块之前进行模拟

Jon*_*han 6 python logging patch mocking

如何在此测试模块(MUT)中进行修补和模拟 getLogger:

# Start of the module under test
import logging
log = logging.getLogger('some_logger')
# ...
Run Code Online (Sandbox Code Playgroud)

我想要做:

mock_logging.getLogger.return_value = Mock()
Run Code Online (Sandbox Code Playgroud)

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

Pel*_*lle 6

这可以通过首先导入和修补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')
Run Code Online (Sandbox Code Playgroud)


rum*_*pel 4

这需要导入模块而不先执行它,不幸的是,除非您执行一些奇特的技巧(例如修改模块的解析树),否则这将无法工作,但您可能也不想这样做。

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