Skip to main content
 首页 » 编程设计

Python 请求之模拟状态代码和响应

2025年05月04日23powertoolsteam

所以我正在为 Python 项目编写一些单元测试,我想模拟对外部 API 的响应。

我的代码是这样的:

r = my_api_client.get(myurl) 
 
try: 
    if r.status_code == 200: 
        my_response = r.json() 
    elif r.status_code != 200: 
        print "bad status code" 
except Exception as e: 
    raise 
 
for x in my_response: 
    ... 

我的问题是如何模拟 my_api_client 以返回正确的状态代码和 json 对象?

我一直在尝试像 my_api_client = mock.Mock(return_value={'status_code':200, 'json_obj': {'blah':'blah'}})

感谢您的帮助

请您参考如下方法:

您可以为响应编写一个复杂的模拟,如下所示:

ok_response_mock = mock.MagicMock() 
type(ok_response_mock).status_code = mock.PropertyMock(return_value=200) 
ok_response_mock.json.return_value = "{'blah':'blah'}" 

这会创建一个 MagicMock(在询问非指定方法时不会提示),向其添加 status_code 属性,该属性返回 200。并配置 JSON 字符串响应到 .json() 方法。

因此,如果 my_api_client 是您测试方法中的一个参数:

my_api_client_mock = mock.MagicMock() 
my_api_client_mock.get.return_value = ok_response_mock 
YourModule.YourMethod(my_api_client_mock) 

这将创建模拟参数,将其连接到先前创建的模拟响应并调用测试方法。 相反,如果 my_api_client 是导入的模块:

@mock.patch('MyModuleUnderTest.my_api_client') 
def test_MyMethodUnderTest__response_ok__stuff_happens(self, api_client_mock): 
   # code to create ok_response_mock 
   api_client_mock.get.return_value = ok_response_mock 

这将使用模拟来修补导入的模块,该模拟会自动为您创建并作为测试方法的参数放置。只需告诉该模拟返回模拟响应即可。