2017-08-06 47 views
-1

我怎樣才能嘲笑方法內的職位,所以我可以有單位測試?蟒蛇模擬帖子裏面的方法

def send_report(self, data): 
     url = settings.WEBHOOK_PO 
     payload = json.dumps(data) 
     requests.post(url, data=payload) 
     url = settings.WEBHOOK_LQA 
     response = requests.post(url, data=payload) 
     return response.status_code 

有沒有一種方法可以覆蓋這種單元測試的方法,而不是實際發佈?

+0

一個選項:https://github.com/getsentry/responses – jonrsharpe

回答

0

您可以使用mock庫別的東西來代替requests.post

with mock.patch('requests.post') as mock_post: 
    foo.send_report(data) 

mockthird-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 
+0

我使用python 2.7 = /所以它不會工作 – alositas

+1

'mock'在2.6或更高版本下工作;直到3.3才成爲標準庫的一部分。 – chepner