【问题标题】:Mocking requests.post and requests.json decoder python模拟 requests.post 和 requests.json 解码器 python
【发布时间】:2023-04-03 12:50:01
【问题描述】:

我正在为我的模块创建一个使用请求库的测试套件。但是,我正在尝试为特定请求模拟几个不同的返回值,但我在这样做时遇到了麻烦。这是我的代码 sn-p 不起作用:

class MyTests(unittest.TestCase):

    @patch('mypackage.mymodule.requests.post') 
    def test_change_nested_dict_function(self, mock_post):
        mock_post.return_value.status_code = 200
        mock_post.return_value.json = nested_dictionary
        modified_dict = mymodule.change_nested_dict()
        self.assertEqual(modified_dict['key1']['key2'][0]['key3'], 'replaced_value')

我试图模拟的函数:

import requests

def change_nested_dict():
    uri = 'http://this_is_the_endpoint/I/am/hitting'
    payload = {'param1': 'foo', 'param2': 'bar'}
    r = requests.post(uri, params=payload)

    # This function checks to make sure the response is giving the 
    # correct status code, hence why I need to mock the status code above
    raise_error_if_bad_status_code(r)

    dict_to_be_changed = r.json()

    def _internal_fxn_to_change_nested_value(dict):
        ''' This goes through the dict and finds the correct key to change the value. 
            This is the actual function I am trying to test above'''
        return changed_dict


    modified_dict = _internal_fxn_to_change_nested_value(dict_to_be_changed)

    return modified_dict

我知道这样做的一种简单方法是不使用嵌套函数,但我只向您展示整个函数代码的一部分。相信我,嵌套函数是必要的,我真的不想更改它的那一部分。

我的问题是,我不明白如何模拟 requests.post 然后为状态代码和内部 json 解码器设置返回值。我似乎也找不到解决这个问题的方法,因为我似乎也无法修补内部函数,这也可以解决这个问题。有没有人有任何建议/想法?非常感谢。

【问题讨论】:

  • 没有必要模拟func _internal_fxn_to_change_nested_value,我在你的测试中没有看到这个函数的任何参数,给出的答案似乎是正确的。

标签:
python
unit-testing
python-requests