您可以使用mock
庫別的東西來代替requests.post
:
with mock.patch('requests.post') as mock_post:
foo.send_report(data)
(mock
是third-party package,但被添加到標準庫,爲unittest
package`的一部分,在Python 3.3。 )
mock_post
可以被配置爲在測試期間提供期望的行爲;有關詳細信息,請參閱mock
文檔。
另一種選擇是修改您的方法採取post
函數作爲參數,而不是硬編碼的功能(這是依賴注入的一個例子):
def send_report(self, data, poster=requests.post):
url = settings.WEBHOOK_PO
payload = json.dumps(data)
poster(url, data=payload)
url = settings.WEBHOOK_LQA
response = poster(url, data=payload)
return response.status_code
當你想測試函數,你只需傳遞一個不同的可調用對象作爲可選的第二個參數。
請注意,您可以爲兩種類型的職位提供獨立功能,它們可能更容易測試比用模擬:
from functools import partial
def send_report(self,
data,
post_po=partial(requests.post, settings.WEBHOOK_PO),
post_lqa=partial(requests.post, settings.WEBHOOK_LQA)):
payload = json.dumps(data)
post_po(data=payload)
response = post_lqa(data=payload)
return response.status_code
一個選項:https://github.com/getsentry/responses – jonrsharpe