Python - проверить исключение свойств

Дано:

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 выделяет символ равенства.

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

Edit:

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

Ответ 1

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

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

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

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

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

Ответ 2

Так как 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"

Ответ 3

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

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

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

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

Ответ 4

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

self.assertRaises(SomeException, lambda: my_instance.some_property)

Ответ 5

Вы получаете ошибку, потому что синтаксическая ошибка в 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()