Я пытаюсь проверить исключение.

У меня есть:

def test_set_catch_status_exception(self):
    mro = self.mro
    NEW_STATUS = 'No such status'
    self.assertRaises(ValueError,mro.setStatus(NEW_STATUS))

Я получаю следующую ошибку:

======================================================================
ERROR: test_set_catch_status_exception (__main__.TestManagementReviewGoalGetters)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_ManagementReviewObjective.py", line 68, in test_set_catch_status_exception
    self.assertRaises(ValueError,mro.setStatus(NEW_STATUS))
  File "/Users/eric/Dropbox/ManagementReview.py", line 277, in setStatus
    raise ValueError('%s is not in the list of allowed statuses: %s' % (status,LIST_OF_STATUSES))
ValueError: No such status is not in the list of allowed statuses: ['Concern or Delay', 'On Track', 'Off Track/Needs Attention']

----------------------------------------------------------------------

Благодарность

19
user290043 22 Июл 2010 в 03:18

2 ответа

Лучший ответ

self.assertRaises ожидает функцию mro.setStatus, за которой следует произвольное количество аргументов: в данном случае просто NEW_STATUS. self.assertRaises собирает свои аргументы в вызов функции mro.setStatus(NEW_STATUS) внутри блока try...except, таким образом улавливая и записывая ValueError, если он возникает.

Передача mro.setStatus(NEW_STATUS) в качестве аргумента для self.assertRaises приводит к возникновению ValueError до того, как self.assertRaises сможет его поймать.

Итак, исправление - заменить круглые скобки запятой:

self.assertRaises(ValueError,mro.setStatus,NEW_STATUS)
39
unutbu 21 Июл 2010 в 23:58

Будьте осторожны, если вы используете factory boy, этот пакет не позволяет поднять исключение до уровня утверждения, который всегда будет терпеть неудачу

1
Julio Marins 12 Фев 2019 в 19:42