Python unittest - напротив assertRaises?

Я хочу написать тест, чтобы установить, что Исключение не возникает в данном случае.

Просто проверить, если exception поднят...

sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath) 

... но как вы можете сделать напротив.

Что-то вроде этого, что я после...

sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath) 

Ответ 1

try:
    myFunc()
except ExceptionType:
    self.fail("myFunc() raised ExceptionType unexpectedly!")

Ответ 2

Просто вызовите функцию. Если он вызывает исключение, инфраструктура unit test будет отмечать это как ошибку. Вы могли бы добавить комментарий, например:

sValidPath=AlwaysSuppliesAValidPath()
# Check PathIsNotAValidOne not thrown
MyObject(sValidPath)

Ответ 3

Привет. Я хочу написать тест, чтобы установить, что Исключение не возникает в данном случае.

Это предположение по умолчанию - исключения не возникают.

Если вы ничего не говорите, это подразумевается в каждом отдельном тесте.

Вам не нужно на самом деле писать какое-либо утверждение для этого.

Ответ 4

Я являюсь оригинальным плакатом, и я принял вышеупомянутый ответ DGH, не используя его сначала в коде.

Как только я использовал, я понял, что ему нужно немного настроить, чтобы на самом деле сделать то, что мне было нужно (честно говоря, DGH он/она сказал "или что-то подобное"!).

Я подумал, что стоит публиковать настройки здесь для других:

    try:
        a = Application("abcdef", "")
    except pySourceAidExceptions.PathIsNotAValidOne:
        pass
    except:
        self.assertTrue(False)

Что я пытался сделать здесь, было убедиться, что если попытаться создать экземпляр объекта Application со вторым аргументом пробелов, будет создан pySourceAidExceptions.PathIsNotAValidOne.

Я считаю, что использование вышеуказанного кода (основанного на ответе DGH) будет делать это.

Ответ 5

Если вы передадите класс Exception в assertRaises(), будет предоставлен контекстный менеджер. Это может улучшить читаемость ваших тестов:

# raise exception if Application created with bad data
with self.assertRaises(pySourceAidExceptions.PathIsNotAValidOne):
    application = Application("abcdef", "")

Это позволяет тестировать ошибки в коде.

В этом случае вы тестируете PathIsNotAValidOne, когда вы передаете недопустимые параметры конструктору приложения.

Ответ 6

Я нашел полезным для обезьяны-патча unittest следующим образом:

def assertMayRaise(self, exception, expr):
  if exception is None:
    try:
      expr()
    except:
      info = sys.exc_info()
      self.fail('%s raised' % repr(info[0]))
  else:
    self.assertRaises(exception, expr)

unittest.TestCase.assertMayRaise = assertMayRaise

Это уточняет намерение при тестировании на отсутствие исключения:

self.assertMayRaise(None, does_not_raise)

Это также упрощает тестирование в цикле, который я часто делаю:

# ValueError is raised only for op(x,x), op(y,y) and op(z,z).
for i,(a,b) in enumerate(itertools.product([x,y,z], [x,y,z])):
  self.assertMayRaise(None if i%4 else ValueError, lambda: op(a, b))