1

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

# A.py
import B

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

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

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

4

1 回答 1

1

如果要确保真正使用模拟,则必须A在修补后重新加载模块foo,因为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):
    ...
于 2020-05-27T05:00:37.620 回答