模拟导入函数内部的模块

时间:2015-12-10 22:44:20

标签: python unit-testing mocking python-mock

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

例如

def my_func(input):
    import something_else
    something_else.do_something(input)

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

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

1 个答案:

答案 0 :(得分:3)

您可以使用与此answer中描述的相同技术。简而言之,您可以修补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)

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