python - 在 Python 中模拟全局函数
问题描述
我有一个像这样的(简化的)脚本,它在全局设置中打开一个文件。但是,此文件不存在于 repo 中(仅在部署期间添加)。
# func.py
import pickle
f = open("model.pkl", "r")
model = pickle.load(f)
def function_a():
# do something
return 1
这是测试脚本。显然它会出错,因为model.pkl
文件不存在。显示此消息FileNotFoundError: [Errno 2] No such file or directory: 'model.pkl'
。
# test_func.py
from func import function_a
def test_function_a():
ret = function_a()
assert 1 == ret
我尝试模拟打开文件的函数,但给出了相同的文件不存在错误。
# test_func.py
from unittest.mock import patch
@patch("func.open")
@patch("func.pickle.load")
def test_function_a(mock_pickle, mock_open):
from func import function_a
ret = function_a()
assert 1 == ret
我知道有两种方法可以克服这个问题。
- 利用
if "pytest" not in sys.modules:
import pickle
import sys
if "pytest" not in sys.modules:
f = open("model.pkl", "r")
model = pickle.load(f)
def function_a():
# do something
return 1
- 将全局文件调用放在下面
if __name__ == "__main__"
import pickle
import sys
def function_a():
# do something
return 1
if __name__ == "__main__":
f = open("model.pkl", "r")
model = pickle.load(f)
但是,我想知道我是否仍然可以在测试脚本中模拟它们,因为这是最优雅的解决方案,无需修改现有脚本。
解决方案
推荐阅读
- c - Gradle Native C 项目:没有从另一个具有相对路径的头文件中包含头文件
- javascript - 本来是不可变的对象,但已在 react-native 应用程序的 redux reducer 中冻结
- r - 在特定条件下对 r 中的数据帧进行分组
- d3.js - D3画布强制定向布局底部问题
- c# - iTextSharp pdf中缺少字体真棒图标
- javascript - 如何在单击元素时选择值
- json - 更新结构中的特定值
- sql - Oracle SQL - 选择 3 个日期中最早的日期,但忽略 NULL
- javascript - HTML 和 CSS 时间轴,顶部和底部带有相对定位的标签
- sql - 如何将 .sql 文件加载到 Scala?