如何在pytest同个测试用例中结合使用patch和capsys?
问题原因及解决方法
1. 报错根因
@patch装饰器生成的mock对象会作为位置参数注入测试函数,所有注入的mock参数必须排在pytest内置fixture(比如capsys)的后面,否则pytest会把靠前的mock参数识别为不存在的fixture,触发你遇到的报错。
2. 正确的测试写法
首先修正参数顺序,同时注意print函数输出默认会携带换行符\n,断言输出时需要匹配该字符:
from unittest.mock import patch # 失败场景测试 @patch('test_file.P_open', return_value=1) def test_mark_config_deployed_failed(capsys, mock_popen): expected_output = "Error, config could not be marked\nSuccess, config was marked\n" device = 'test-device' mark_config(device) out, err = capsys.readouterr() assert out == expected_output # 可选:验证mock被正确调用 mock_popen.assert_called_once_with(['command','device','args']) # 成功场景测试 @patch('test_file.P_open', return_value=0) def test_mark_config_deployed_success(capsys, mock_popen): expected_output = "Success, config was marked\n" device = 'test-device' mark_config(device) out, err = capsys.readouterr() assert out == expected_output
3. 额外注意事项
你当前的mark_config函数存在逻辑缺陷:无论P_open返回成功还是失败,都会打印Success, config was marked,需要补充else分支调整逻辑:
def mark_config(device): args = ['command','device','args'] result = P_open(args) if result != 0: print('Error, config could not be marked') else: # 补充else分支避免成功、失败场景都输出成功日志 print('Success, config was marked')
修正逻辑后,失败场景的断言输出可以去掉对应的成功日志内容。
内容的提问来源于stack exchange,提问作者Hugo Reyes
相关产品推荐
相关产品推荐

