模拟导入模块时调用的函数

Mock a function which is called when a module is imported

我想测试一个使用带参数的装饰器的模块 A。加载模块 A 时会评估参数。对于某些装饰器参数,我通过调用模块 B 中的函数 foo 来设置值。

# A.py
import B

@deco(arg1=B.foo())
def bar():
  ...

当我想测试 A 时,我想模拟 B.foo 以便为我的测试用例设置装饰器参数。我认为必须在 A 加载 B 之前模拟 B.foo

在单元测试中,作为 A 的调用者,如何模拟 B.foo 以确保在评估 A 中的装饰器参数时使用模拟版本?

如果你想确保真正使用模拟,你必须在修补 foo 后重新加载模块 A,因为 bar 已经用原始 foo。您可以将其包装在这样的夹具中(未经测试):

import importlib
import pytest
from unittest import mock
import A

@pytest.fixture
def mocked_foo():
    with mock.patch('B.foo') as mocked:
        importlib.reload(A)
        yield mocked

def test_bar(mocked_foo):
    ...