2017-03-06 46 views
1

所以我正在爲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

回答

1

可以組成一個模擬複雜的反應,就像這樣:

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 

這將修補與模擬導入的模塊,爲您自動創建並放置作爲參數傳遞給你的測試方法。只要說出這個模擬回報模擬的迴應。