You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为特定文件mock pathlib.Path.read_text方法?

如何Mock pathlib.Path的read_text方法?

Python官方unittest文档里的mock_open可以直接mock对builtins.open的直接调用,但面对pathlib.Path.read_text()时,直接套用文档方案会失效。比如这段目标代码:

import pathlib

pathlib.Path("/path/to/file").read_text()

下面提供两种可行的Mock方案:

方案1:直接Mock read_text方法

这是最直观的方式,无需关心底层实现,直接patchpathlib.Path的read_text方法:

from unittest.mock import patch
import pathlib

def test_pathlib_read_text():
    with patch.object(pathlib.Path, 'read_text', return_value='模拟的文件内容') as mock_read:
        content = pathlib.Path('/path/to/file').read_text()
        # 验证返回内容
        assert content == '模拟的文件内容'
        # 验证方法被调用一次
        mock_read.assert_called_once()

方案2:Mock pathlib内部引用的open

如果一定要从底层open入手,需要明确:pathlib模块在导入时已经将builtins.open绑定到自身命名空间中,因此直接patch全局的builtins.open不会影响它的内部调用,必须patchpathlib模块内的open引用:

from unittest.mock import mock_open, patch
import pathlib

def test_pathlib_through_open():
    with patch('pathlib.open', mock_open(read_data='模拟的文件内容')) as mock_file:
        content = pathlib.Path('/path/to/file').read_text()
        assert content == '模拟的文件内容'
        # 验证open被正确调用,参数符合预期
        mock_file.assert_called_once_with('/path/to/file', mode='r', encoding=None, errors=None)

为什么直接patch builtins.open无效?

Python模块的导入是静态绑定的,pathlib在加载时就把builtins.open的引用存到了自己的模块命名空间里,后续调用read_text时用的是这个本地引用,而非全局的builtins.open,所以全局patch不会生效。

内容的提问来源于stack exchange,提问作者LondonRob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:58:39