python - 如何模拟在 python 中为特定路径打开的文件?
问题描述
所以我知道在我的单元测试中我可以模拟一个上下文管理器 open(),即:
with open('file_path', 'r') as stats:
嘲笑
with mock.patch('builtins.open', mock.mock_open(read_data=mock_json)):
但是有没有办法让我只为特定的文件路径模拟它?或者可能是其他方式来确保在单元测试中使用正确的路径调用上下文管理器?
解决方案
要仅为特定路径模拟打开,您必须提供自己的模拟对象,根据路径以不同方式处理打开。假设我们有一些功能:
def do_open(path):
with open(path, "r") as f:
return f.read()
open
如果是“bar”,则应模拟where以返回内容为“bar”的文件path
,否则照常工作,您可以执行以下操作:
from unittest import mock
from my_module.do_open import do_open
builtin_open = open # save the unpatched version
def mock_open(*args, **kwargs):
if args[0] == "foo":
# mocked open for path "foo"
return mock.mock_open(read_data="bar")(*args, **kwargs)
# unpatched version for every other path
return builtin_open(*args, **kwargs)
@mock.patch("builtins.open", mock_open)
def test_open():
assert do_open("foo") == "bar"
assert do_open(__file__) != "bar"
如果您不想将原始文件保存open
在全局变量中,也可以将其包装到一个类中:
class MockOpen:
builtin_open = open
def open(self, *args, **kwargs):
if args[0] == "foo":
return mock.mock_open(read_data="bar")(*args, **kwargs)
return self.builtin_open(*args, **kwargs)
@mock.patch("builtins.open", MockOpen().open)
def test_open():
...
推荐阅读
- flash - 我需要做什么才能让新版本的 Animate 运行 Actionscript 2.0?
- java - 如何使元素水平拉伸
- image - React Native:图像不可见
- arrays - 两个 ngFor 循环的角度随机播放数组元素
- reactjs - 如何在反应中使用打字稿在div中传递样式
- python - 使用多个 pandas datadframes-Python 创建一个绘图
- python - 创建一个新的数据框,列出关键字及其各自值的总和
- python - 如何展平嵌套的字典并在碰撞时使用内部值
- leaflet - 我可以使用 OpenStreetMaps.org 数据从代码中创建什么道路网格?
- javascript - 分组数据,重命名对象属性并在 NodeJs 中创建新数据集