模拟函数而不使用unittest执行它

问题描述 投票:0回答:1

我有一个函数,可以从

data.json
中定义的
models.py
文件加载数据,如下所示:

def load_data():
    file_path = Path(__file__).parent / 'data.json'
    with open(file_path, 'r') as file:
        data = json.load(file)['data']
        return data

loaded_data = load_data()

我在

loaded_data
中定义的所有函数中都使用了
models.py
data.json
文件包含一个 JSON 数组。

我的

test_models.py
如下:

from unittest.mock import patch
from models import ... (a list of function to test)


# For replaceing model.load_data()
mock_data = []
def get_mock_data():
    return mock_data


@patch('models.load_data', side_effect= get_mock_restaurants)
class TestRestaurantsModel(unittest.TestCase):

然而,不知何故,真正的

models.load_data
仍然被执行。我知道这一点是因为我将
file_path
更改为
randomabc.json
并得到了
FileNotFoundError
。如何阻止
models.load_data
的执行?我本质上不需要嘲笑
models.load_data
。我只需要在测试期间阻止它的执行,并将模拟数据分配给
models.data

python python-unittest
1个回答
0
投票

patch
文档字符串说:

target
应该是
'package.module.ClassName'
形式的字符串。
target
被导入
并且指定的对象替换为
new
对象,因此
target
必须可以从您所在的环境中导入 打电话给
patch
。当修饰函数时导入目标 是执行的,而不是在装饰时执行的。

重要的部分是

target
是导入的(在本例中为
models.load_data
),因此它运行
loaded_data = load_data()
行。

我找不到避免这种行为的方法,目前我不确定是否可能。

我面临着类似的情况,所以这里的任何帮助都会对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.