ошибка assertRises - PullRequest
       4

ошибка assertRises

5 голосов
/ 22 января 2012

Я пытаюсь написать модульный тест, который при необходимости вызовет HTTPException.Вот тест:

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

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

Ответы [ 2 ]

7 голосов
/ 22 января 2012

Должно быть:

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 имеет доступ к функции и ее аргументам, он может вызвать саму функцию и перехватить соответствующее исключение.

1 голос
/ 24 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...