我正在模拟python的内部库类(服务器),该类提供与HTTP JSON-RPC服务器的连接。但是在运行测试时,该类不是模拟的。该类用于调用项目类,该项目类是其他类的包装器,可以有效地实例化Server类。
我在这里提取代码部分,使我在说什么变得有意义。
单元测试:
@patch('jsonrpc_requests.jsonrpc.Server')
def test_get_question_properties(self, mockServer):
lime_survey = Questionnaires()
# ...
课堂问卷:
class Questionnaires(ABCSearchEngine):
""" Wrapper class for LimeSurvey API"""
def get_question_properties(self, question_id, language):
return super(Questionnaires, self).get_question_properties(question_id, language)
类调查表从类get_question_properties
中调用方法ABCSearchEnginge(ABC)
。此类初始化Server
类以提供与外部API的连接。
ABCSearchEnginge类:
class ABCSearchEngine(ABC):
session_key = None
server = None
def __init__(self):
self.get_session_key()
def get_session_key(self):
# HERE the self.server keep getting real Server class instead the mocked one
self.server = Server(
settings.LIMESURVEY['URL_API'] + '/index.php/admin/remotecontrol')
由于测试是在模拟Server类,为什么不模拟呢?缺少什么?
答案 0 :(得分:0)
根据我的观察,您没有添加返回值。
您是否将模拟值放在@patch('jsonrpc_requests.jsonrpc.Server')
中?
如果您尝试添加MagicMock,会发生什么情况(不要忘记添加from mock import patch, MagicMock
)?
@patch('jsonrpc_requests.Server', MagicMock('RETURN VALUE HERE'))
您还需要模拟__init__
方法(其中Server
是这个from jsonrpc_requests import Server
的方法)
@patch.object(Server, '__init__', MagicMock(return_value=None))
我是根据自己的理解推断出您的问题的,也许您需要修复一些路径(Mock
需要确切的路径才能完成工作)。