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

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

问题描述:

所以我正在为Python项目编写一些单元测试,我想模拟对外部API的响应。Python请求 - 模拟状态代码和响应

我的代码如下所示:

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'}})

感谢所有帮助

+0

您是否知道['respond'](https://github.com/getsentry/responses)?然后你可以检查你是否正在碰到正确的端点,等等。 – jonrsharpe

可以组成一个模拟复杂的反应,就像这样:

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(即在询问非speficied方法时不会抱怨),将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 

这将修补与模拟导入的模块,为您自动创建并放置作为参数传递给你的测试方法。只要说出这个模拟回报模拟的回应。