2012-01-22 2 views
5

Я пытаюсь написать единичный тест, который обеспечит, когда HTTPException будет повышен, когда это необходимо. Вот тест:assertRises failure

import unittest 
from requests import HTTPError 
import pyport 

# Code omitted... 
def test_bad_item_type(self): 
    """A bad item type should raise a HTTPError""" 
    test_type = 'bad' 
    test_id = 1986134 
    self.assertRaises(HTTPError, pyport.get_item(test_type, test_id)) 

Который производит следующее:

ERROR: test_bad_item_type (__main__.TestPyportFunctions) A bad item 
type should raise requests.HTTPError 
---------------------------------------------------------------------- 
Traceback (most recent call last): File "./tests.py", line 65, in 
test_bad_item_type 
    self.assertRaises(HTTPError, pyport.get_item(test_type, test_id)) File "/home/sean/workspace/pyport/pyport.py", line 54, in get_item 
    response.raise_for_status() File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 741, fin raise_for_status 
    raise HTTPError('%s Client Error' % self.status_code) HTTPError: 404 Client Error 

Исключение повышено, но не зацепила испытанием. Это похоже на то, что произошло в this question, но это не совсем то же самое. Может ли кто-нибудь сказать мне, что мне не хватает?

ответ

7

Оно должно быть:

self.assertRaises(HTTPError, pyport.get_item, test_type, test_id) 

Смотреть подпись assertRaises:

assertRaises(exception, callable, *args, **kwds) 

Это определяется таким образом, потому что если вы делаете это ваш путь, интерпретатор Python первые звонки pyport.get_item(test_type, test_id) и затем передает его результат assertRaises. Результат assertRaises не вызывается вообще, и исключение не попадает. Теперь, если assertRaises имеет доступ к функции и ее аргументам, она может вызывать эту функцию и улавливать соответствующее исключение.

+0

Благодарим вас за подробное объяснение. –

1

Если вы используете Python 2.7 или более поздней версии или вы используете портированном unittest2 модуль вместо UnitTest, вы можете избежать того, чтобы написать странный синтаксис при использовании assertRaises, используя его в качестве контекста менеджера:

with self.assertRaises(HTTPError): 
    pyport.get_item(test_type, test_id) 

http://docs.python.org/library/unittest.html#basic-example