使用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
相关产品推荐
相关产品推荐

