如何在Python中修补来自其他文件的request.get

时间:2019-03-28 09:46:21

标签: python unit-testing mocking patch

我有2个python文件:1个用于单元测试(tests.py),1个用于我要测试的脚本(main.py):

# In main.py:

import requests

def get_response(url):
    response = requests.get(url);
    # Do stuff...
    return response

-

# In tests.py

from unittest import mock
from unittest.mock import patch
from my_project.main import get_response

def some_handler(url):
    return "test_response"

class GetResponseTestCase(unittest.TestCase):

    def setUp(self):

        # setup mocks
        patch('requests.get', mock.Mock(side_effect=some_handler)

    def run_test(self):

        result = get_response("test_response")

我想修补requests.get以返回test_response,但是修补无法正常工作,因为它试图发送请求/与所提供的URL建立连接。我认为补丁名称requests.get并不针对它在main.py中使用的位置(因为它是指它的定义位置),正如一些人在网上提到的那样。但是在这种情况下,我不确定如何解决此问题。

如果main.py中使用了import requests,那么如何从另一个文件中对其进行修补?谢谢。

2 个答案:

答案 0 :(得分:1)

  1. 模拟 get_reponse 而不是模拟 requests.get (模拟内置函数;在这种简单的用例中不需要在python中实现)。
  2. li>
  3. 模拟的get_response 函数的返回值设置为“ test_response”

在tests.py

from unittest import mock

class GetResponseTestCase(unittest.TestCase):

    @mock.patch("my_project.main.get_response") ##mocking get_response
    def run_test(self, mocked_get_response):
        mocked_get_response.return_value = "test_response" ## setting return value

答案 1 :(得分:0)

发现在创建补丁的调用结束时需要添加.start()

# setup mocks
patch('requests.get', mock.Mock(side_effect=some_handler).start()

如果此解决方案有任何问题,或者有更好的解决方法,我很想听听!