Python单元测试:如何用Mock触发Socket连接异常测试异常分支?
解决方法
你当前的问题是没有正确让connect方法抛出异常,而是错误地设置了它的返回值。要触发ConnectionRefusedError,需要给connect方法的side_effect属性赋值,而非return_value。
修正后的测试代码
import client import socket def test_1(self, mocker, capsys): # 模拟socket.socket构造函数 mock_socket = mocker.patch("socket.socket") # 获取模拟生成的socket实例对象 mock_sock_instance = mock_socket.return_value # 设置connect方法调用时抛出ConnectionRefusedError异常 mock_sock_instance.connect.side_effect = ConnectionRefusedError("[WinError 10061] 由于目标计算机积极拒绝,无法连接。") client1 = client.Client() client1.execute("https://example.com") captured = capsys.readouterr() # 断言时去除末尾换行符,避免格式不匹配 assert captured.out.strip() == "Error sending request to https://example.com : [WinError 10061] 由于目标计算机积极拒绝,无法连接。"
关键说明
return_value用于指定方法调用后返回的结果,而side_effect的作用是指定方法调用时触发的行为,包括抛出异常、动态返回不同值等,这里需要用它来触发异常。- 若要精准匹配错误信息,直接传入带完整描述的
ConnectionRefusedError实例即可;如果需要兼容旧版Python,也可以使用socket.error替代。 - 断言时建议用
strip()处理捕获的输出,消除末尾换行符带来的匹配失败问题。
内容的提问来源于stack exchange,提问作者zaelcovsky
相关产品推荐
相关产品推荐

