如何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
相关产品推荐
相关产品推荐

