【问题标题】:How to mock a Django internal library using patch decorator如何使用补丁装饰器模拟 Django 内部库
【发布时间】:2018-11-05 14:29:54
【问题描述】:

我正在模拟一个 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)

班级问卷从班级ABCSearchEnginge(ABC) 调用方法get_question_properties。该类初始化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')

由于测试是模拟服务器类,为什么它不模拟?缺少什么?

【问题讨论】:

    标签: python django unit-testing mocking


    【解决方案1】:

    据我所知,您没有添加返回值。

    您是否将模拟值放入:@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 需要确切的路径来完成这项工作)。

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 2021-07-19
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2021-12-20
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多