模拟在函数内部导入的模块

aam*_*iri 5 python unit-testing mocking python-mock

是否可以模拟在函数内部导入的模块?

例如

def my_func(input):
    import something_else
    something_else.do_something(input)
Run Code Online (Sandbox Code Playgroud)

由于循环依赖,我在函数内部有一个导入。基于我的谷歌搜索,我认为我是 SOL,但想知道是否有人知道如何使这成为可能。

我只想验证 do_something 是否被调用。

Mic*_*ico 5

您可以使用此答案中描述的相同技术。简而言之,你可以修补sys.modules字典。所以你的测试可以是:

from unittest.mock import patch, MagicMock

...

def test_call_do_something(self):
    m = MagicMock()
    with patch.dict("sys.modules", something_else=m):
        input_mock = MagicMock()
        my_func(input_mock)
        m.do_something.assert_called_with(input_mock)
Run Code Online (Sandbox Code Playgroud)

你可以通过装饰器重写它patch,但m应该是一个静态实例。