gpt4 book ai didi

Python3 单元测试模拟请求模块

转载 作者:太空宇宙 更新时间:2023-11-04 10:05:37 25 4
gpt4 key购买 nike

我很乐意通过 Java 的 Mockito 库使用依赖注入(inject),但对使用 Python3 的 unittest.mock 模块没有什么经验。我试图断言 Request 实例的 prepare 方法被调用。然而,测试在断言 self.assertTrue(mock_request.prepare.called) 上失败。有人可以告诉我如何通过这个测试吗?

import requests

import unittest
from unittest import mock

class Engine(object):

def get(self, **kwargs):

session = requests.Session()
req = requests.Request('GET', 'http://www.google.com', params=kwargs).prepare()
response = session.send(req, timeout=1)


class TestEngine(unittest.TestCase):

@mock.patch('requests.Session')
@mock.patch('requests.Request')
def test_get(self, mock_request, mock_session):

e = Engine()
e.get()

self.assertTrue(mock_request.called)
self.assertTrue(mock_request.prepare.called)

if __name__ == '__main__':
unittest.main()

最佳答案

您的代码永远不会直接访问 Request 上的 prepare。该方法是在调用 Request()返回值 上访问的,因此请使用 Mock.return_value attribute 对其进行测试:

self.assertTrue(mock_request.return_value.prepare.called)

调试模拟问题时,我发现打印出 Mock.mock_calls attribute 很有帮助对于顶级模拟对象;为您的测试打印 mock_request.mock_calls 产生:

[call('GET', 'http://www.google.com', params={}), call().prepare()]

表明 call().prepare() 确实被访问了(并且 call() 的结果通常可以通过 Mock.return_value 属性,如上所示)。

关于Python3 单元测试模拟请求模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41200056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com