Python HTTP Post method returns response as magicmock object instead of value

*爱你&永不变心* 提交于 2020-01-04 06:35:39

问题


I am trying to check the response status code after trigerring some API with a POST method, Response status code is of Magicmock instance type, i am checking whether the status code is inbetween 400 and 500 using comparison operator which works in python 2 but raises TypeError in python 3

import mock
response = <MagicMock name='Session().post()' id='130996186'>

Below code works in python 2

if (400 <= response.status_code <= 500):
    print('works')

But when executed in python 3, raises

TypeError: '<=' not supported between instances of 'int' and 'MagicMock'

class BMRAPI(object): root_url = None

    def __init__(self, user, api_key, root_url=BMR_URL,
             api_uri=RESULTS_API_URI):
        self.log = 
        logging.getLogger("BMRframework.Reporting.BMR6.BMRAPI")
        self.root_url = root_url
        self.url = urljoin(root_url, api_uri)
        self.log.info("Connecting to BMR REST API: %s" % self.url)
        self.session = requests.Session()
        auth = 'ApiKey {0}:{1}'.format(user, api_key)
        self.session.headers.update({
            'Content-type': 'application/json',
            'Accept': 'text/plain',
            'Authorization': auth})
        self.session.trust_env = False  # bypass the proxy

        self.log.debug("Authenticating as: %s" % user)
        self.log.debug("Using API Key: %s" % api_key)`enter code here`
        self.log.info("Connection to REST API successful")

    def url_for_resource(self, resource_name):
       return urljoin(self.url, resource_name) + "/"

    def create(self, resource_name, data):
        response = self.session.post(self.url_for_resource(resource_name),
                                 json.dumps(data), timeout=TIMEOUT)
        return self.handle_response(response)

    def handle_response(self, response):
        if (400 <= response.status_code <= 500):
            print('mars')

Below is the UNit test case

@mock.patch("requests.Session")
def BMRAPI(Session):
    api = BMRAPI('http://1.2.3.4/', 'dummy_user', '12345')
    data = {'hello': 123}
    api.create('testresource', data)

回答1:


This isn't exactly a fix, more of a workaround.

Instead of making that <= comparison, write a separate method:

def is_4xx_or_5xx_code(status_code):
    return 400 <= status_code <= 500

if is_4xx_or_5xx_code(status_code=response.status_code):
    print('works')

Then mock it in your tests.

@mock.patch('path.to_code.under_test.is_4xx_or_5xx_code')
def test_your_method(mock_status_code):
    mock_status_code.return_value = True
    # rest of the test.


来源:https://stackoverflow.com/questions/55951354/python-http-post-method-returns-response-as-magicmock-object-instead-of-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!