Почему assertRaises не является ловлей моей Ошибки Атрибута с помощью Python unittest?

Существует-f опция к umount, который можно попробовать:

umount -f /mnt/fileshare

Вы указывающий опцию '-t сиф смонтироваться? Также удостоверьтесь, что Вы не указываете 'трудную' опцию смонтироваться.

можно также хотеть рассмотреть fusesmb, так как файловая система будет работать в пространстве пользователя, можно уничтожить его точно так же, как любой другой процесс.

24
задан Craig Stuntz 14 August 2009 в 01:23
поделиться

2 ответа

Я думаю, это потому, что assert raises принимает только вызываемые. Он проверяет, вызывает ли вызываемый объект исключение, а не сам оператор.

self.assertRaises(AttributeError, getattr, branch[0], "childrennodes")

должен работать.

РЕДАКТИРОВАТЬ:

Поскольку THC4k правильно говорит, он собирает операторы во время сбора и затем выдает ошибку, а не в время тестирования.

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

@raises(AttributeError)
def test_1(self)
    branch[0].childrennodes
22
ответ дан 28 November 2019 в 22:21
поделиться

Когда тест запущен, перед вызовом self.assertRaises, Python должен найти значение всех аргументов метода. При этом он оценивает branch[0].children_nodes, что вызывает ошибку AttributeError. Поскольку мы еще не вызвали assertRaises, это исключение не будет поймано, что приведет к неудаче теста.

Решение состоит в том, чтобы обернуть branch[0].children_nodes в функцию или лямбду:

self.assertRaises(AttributeError, lambda: branch[0].children_nodes)

assertRaises также можно использовать в качестве менеджера контекста (начиная с Python 2.7, или в PyPI пакете 'unittest2'):

with self.assertRaises(AttributeError):
    branch[0].children_nodes
    # etc

Это хорошо, потому что его можно использовать для произвольных блоков кода в середине теста, вместо того, чтобы создавать новую функцию только для определения блока кода, к которому он применяется.

Это может дать вам доступ к поднятому исключению для дальнейшей обработки, если это необходимо:

with self.assertRaises(AttributeError) as cm:
    branch[0].children_nodes

self.assertEquals(cm.exception.special_attribute, 123)
55
ответ дан 28 November 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: