我有一个函数,可以从
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
。
patch
文档字符串说:
应该是target
形式的字符串。 的'package.module.ClassName'
被导入 并且指定的对象替换为target
对象,因此new
必须可以从您所在的环境中导入 打电话给target
。当修饰函数时导入目标 是执行的,而不是在装饰时执行的。patch
重要的部分是
target
是导入的(在本例中为models.load_data
),因此它运行loaded_data = load_data()
行。
我找不到避免这种行为的方法,目前我不确定是否可能。
我面临着类似的情况,所以这里的任何帮助都会对我有用。