2017-08-06 17 views
-1

私はunitTestsを持つことができる方法の中でポストを模擬することができますか?python模擬ポストのメソッド内

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

あなたは何か他のものでrequests.postを置き換えるためにmockライブラリを使用することができます。

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

mockthird-party packageですが、Pythonの3.3で、unittest package`の一環として、標準ライブラリに追加されました。 )

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 

関数をテストしたい場合は、別の呼び出し可能オブジェクトをオプションの第2引数として渡します。モックと比べてテストすることが容易になるかもしれないあなたはポストの2種類の別々の機能を供給することができ

注:

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

関連する問題