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

如何Mock Suds Client避免真实Socket调用?单元测试报错求助

解决Suds Client在类构造函数中的Mock问题

你这明显是踩了mock路径的坑——用mock.patch最容易栽在这里,我来帮你理顺正确的做法:

核心问题:找对Patch的目标路径

你的MYClass里写了from suds.client import Client,这意味着在my_class模块中,Client是一个直接的模块级引用。所以你需要patch的是**my_class.Client**,而不是那些乱七八糟的错误路径(比如my_class.MYClass.suds.client.Client或者suds.client.Client)。之前你试@patch('my_class.Client')时触发Socket错误,是因为没正确配置mock对象的返回值,导致代码还是试图调用真实的Client方法。

正确的测试代码

下面是调整后的单元测试,能彻底避免真实网络请求:

from me import my_class
from mock import patch

# 假设这是你预先定义好的测试返回数据
good_wsdl_data = {"status": "success", "data": "test_result"}

@patch('my_class.Client')
def test_sip_stuff(mock_client_class):
    # 1. 配置Client实例的mock:当Client被实例化时,返回一个mock对象
    mock_client_instance = mock_client_class.return_value
    
    # 2. 给mock实例的service.testwsdl方法设置返回值
    mock_client_instance.service.testwsdl.return_value = good_wsdl_data
    
    # 3. 创建MYClass实例,此时构造函数里的Client会是我们的mock
    test_instance = my_class.MYClass(
        host='10.10.10.20',
        usern='user',
        passw='pass'
    )
    
    # 4. 调用方法并验证结果
    return_value = test_instance.run_wsdl(data='something')
    assert return_value == good_wsdl_data
    
    # 可选:验证Client是否按预期被实例化了一次
    mock_client_class.assert_called_once_with(
        'https://10.10.10.20/server/GetWsdl?wsdl',
        transport=test_instance.transport,
        timeout=5
    )
    
    # 可选:验证testwsdl方法是否被正确调用
    mock_client_instance.service.testwsdl.assert_called_once_with(data='something')

为什么之前的方法失败?

  • @patch('my_class.MYClass.suds.client.Client'):路径完全错误,MYClass里根本没有suds.client.Client这个属性,直接抛出ImportError。
  • @patch('my_class.suds.client.Client'):同样路径错误,my_class模块里不存在suds.client这个子模块引用。
  • @patch('my_class.Client')却用patch.object(mock_client.client.service, 'testwsdl'):这里的mock_client是Client类的mock,mock_client.client根本不存在——你应该操作mock_client.return_value(也就是实例化后的mock对象),而不是mock_client本身。

额外提示:如果CustomTransport也需要Mock

如果你的CustomTransport也涉及网络操作,你可以用同样的方式patch它的路径(比如my_class.CustomTransport),确保整个初始化过程都没有真实的IO操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:47:55