首页 > 解决方案 > 在 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

我知道有两种方法可以克服这个问题。

  1. 利用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
  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)

但是,我想知道我是否仍然可以在测试脚本中模拟它们,因为这是最优雅的解决方案,无需修改现有脚本。

标签: pythonmockingglobal

解决方案


推荐阅读