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

使用unittest.mock.patch模拟subprocess.check_output不生效如何解决

问题原因

你的mock规则没有命中实际调用的方法引用,核心是Python的unittest.mock遵循**「在哪调用,mock哪」**的规则:
你在测试文件头部提前执行了from subprocess import check_output,相当于在当前测试模块的命名空间里创建了一个独立的、指向原生subprocess.check_output的引用。你后续@patch('subprocess.check_output')仅修改了subprocess原模块内的方法引用,并没有修改测试模块里已经导入完成的check_output变量,所以测试执行时调用的仍然是原生方法。

解决方案

方案1:调整导入方式,调用时使用原模块前缀

from unittest.mock import patch
import subprocess  # 直接导入subprocess模块,不单独导入check_output

@patch('subprocess.check_output', return_value=b"not a date")
def test_mock_check_output(mock_check_output):
    result = subprocess.check_output(['date'])
    print(result)
    mock_check_output.assert_called()

方案2:patch当前测试模块内已导入的引用

如果要保留原来的导入写法,只需要把patch的路径改成当前测试模块内的check_output引用即可,假设你的测试文件名为test_mock_check_output.py:

from unittest.mock import patch
from subprocess import check_output

# patch当前测试模块内的check_output变量
@patch('test_mock_check_output.check_output', return_value=b"not a date")
def test_mock_check_output(mock_check_output):
    result = check_output(['date'])
    print(result)
    mock_check_output.assert_called()

注意:原生subprocess.check_output默认返回bytes类型,示例中return_value加了b前缀和原生行为对齐,避免后续业务逻辑判断出现类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:00:03