我想测试一个使用带有参数的装饰器的模块A
。加载模块A
时,将评估参数。对于某些装饰器参数,我通过调用模块B
中的函数foo
来设置值。
# A.py
import B
@deco(arg1=B.foo())
def bar():
...
当我想测试A
时,我想模拟B.foo
以便为我的测试用例设置装饰器参数。我认为B.foo
在加载B
A
之前必须被嘲笑.
在单元测试中,作为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):
...