如何使用补丁装饰器模拟Django内部库

时间:2018-11-05 14:29:55

标签: python django unit-testing mocking

我正在模拟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类,为什么不模拟呢?缺少什么?

1 个答案:

答案 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需要确切的路径才能完成工作)。