Python - проверка свойства выдает исключение - PullRequest
11 голосов
/ 14 января 2010

Дано:

def test_to_check_exception_is_thrown(self):
    # Arrange
    c = Class()
    # Act and Assert
    self.assertRaises(NameError, c.do_something)

Если do_something выдает исключение, тест проходит успешно.

Но у меня есть свойство, и когда я заменяю c.do_something на c.name = "Name", я получаю сообщение об ошибке, что мой тестовый модуль не импортируется, и Eclipse выделяет символ равенства.

Как проверить, что свойство вызывает исключение?

Изменить:

setattr и getattr являются новыми для меня. Они, безусловно, помогли в этом случае, спасибо.

Ответы [ 5 ]

15 голосов
/ 14 января 2010

assertRaises ожидает вызываемый объект. Вы можете создать функцию и передать ее:

obj = Class()
def setNameTest():
    obj.name = "Name"        
self.assertRaises(NameError, setNameTest)

Другая возможность заключается в использовании setattr:

self.assertRaises(NameError, setattr, obj, "name", "Name")

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

12 голосов
/ 14 мая 2014

Поскольку Python 2.7 и 3.1 assertRaises() можно использовать в качестве менеджера контекста. См. здесь для Python 2 и здесь для Python3 .

Таким образом, вы можете написать свой тест с помощью инструкции with следующим образом:

def test_to_check_exception_is_thrown(self):
    c = Class()
    with self.assertRaises(NameError):
        c.name = "Name"
8 голосов
/ 14 января 2010

Второй аргумент assertRaises должен быть вызываемым .

Оператор присваивания (т. Е. class.name = "Name") не вызывается, поэтому он не будет работать. Используйте setattr для выполнения назначения так же, как и

self.assertRaises(NameError, setattr, myclass, "name", "Name")

Кроме того, вы не можете присвоить class, так как это ключевое слово.

0 голосов
/ 07 июля 2017

Как сказал @interjay, он ожидает callble, но вам не нужно определять именованную функцию для этого, лямбда это сделает:

self.assertRaises(SomeException, lambda: my_instance.some_property)
0 голосов
/ 14 января 2010

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

>>> print(foo = 'bar')
------------------------------------------------------------
   File "<ipython console>", line 1
     print(foo = 'bar')
               ^
SyntaxError: invalid syntax

Но выполнение этого в два этапа работает нормально:

>>> foo = 'bar'
>>> print(foo)
bar

Чтобы проверить, что свойство вызывает исключение, используйте блок try:

try:
   object.property = 'error'
except ExpectedError:
   test_passes()
else:
   test_fails()
...