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()