模拟导入模块时调用的函数
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):
...
我想测试一个使用带参数的装饰器的模块 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):
...