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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:50:08