2016-09-29 8 views
-1

私はAPIにgetリクエストを送信するシンプルな関数を持っていますが、scriprtがエラーを出力したと主張するUnitテストを書くことができますリクエストが例外を返す場合は終了します。Pythonのunittesting request.getで特定の例外を発生させないようにしてください。

def fetch_members(self): 
    try: 
     r = requests.get(api_url, auth=('user', api_key)) 
    except requests.exceptions.HTTPError as error: 
     print(error) 
     sys.exit(1) 

私は次のテストを試してみたが、HTTPErrorはどのように私は常にエラーのいくつかの並べ替えを高めるためにrequests.getのパッチ適用について正しく行くだろう

import requests 
from unittest.mock import patch 

@patch('sys.exit') 
@patch('sys.stdout', new_callable=StringIO) 
@patch('requests.get') 
def test_fetch_members_with_bad_request(self, mock_get, mock_stdout, 
             mock_exit): 
    response = requests.Response() 
    response.status_code = 400 # Bad reqeust 
    mock_get.return_value = response 
    mock_get.side_effect = requests.exceptions.HTTPError 
    with self.assertRaises(requests.exceptions.HTTPError): 
     fetch_members() 
     mock_exit.assert_called_once_with(1) 
     self.assertIsNotNone(mock_stdout.getvalue()) 

を提起したことはありませんか?

+1

サンプルコード*は例外を発生させますが、関数*はそれをキャッチして処理します*。 –

答えて

1

あなたの機能キャッチし、例外を処理します。

except requests.exceptions.HTTPError as error: 

これはあなたのassertRaises()が失敗したので、それは、さらに伝播しない決して意味。ちょうどsys.exit()が呼び出されたと主張してください、それだけで十分です。

戻り値も設定する必要はありません。その呼び出しは代わりに例外を発生させます。次のようにすれば十分です:

@patch('sys.exit') 
@patch('sys.stdout', new_callable=StringIO) 
@patch('requests.get') 
def test_fetch_members_with_bad_request(self, mock_get, mock_stdout, 
             mock_exit): 
    mock_get.side_effect = requests.exceptions.HTTPError 
    fetch_members() 
    mock_exit.assert_called_once_with(1) 
    self.assertIsNotNone(mock_stdout.getvalue()) 
関連する問題