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



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

# A.py
import B
@deco(arg1=B.foo())
def bar():
...

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

在单元测试中,作为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):
...

相关内容

  • 没有找到相关文章