假设:
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
对我来说是新手。在这种情况下,他们肯定有所帮助,谢谢。
答案 0 :(得分:15)
assertRaises
期望一个可调用的对象。您可以创建一个函数并传递它:
obj = Class()
def setNameTest():
obj.name = "Name"
self.assertRaises(NameError, setNameTest)
另一种可能性是使用setattr
:
self.assertRaises(NameError, setattr, obj, "name", "Name")
您的原始代码会引发语法错误,因为赋值是一个语句,不能放在表达式中。
答案 1 :(得分:12)
由于Python 2.7和3.1 assertRaises()
可以用作上下文管理器。请参阅here for Python 2和here for Python3。
因此,您可以使用with
指令编写测试,如下所示:
def test_to_check_exception_is_thrown(self):
c = Class()
with self.assertRaises(NameError):
c.name = "Name"
答案 2 :(得分:8)
The second argument to assertRaises
should be a callable
赋值语句(即class.name = "Name"
)不是可调用的,因此它不起作用。使用setattr
执行分配
self.assertRaises(NameError, setattr, myclass, "name", "Name")
此外,您无法分配到class
,因为它是关键字。
答案 3 :(得分:0)
正如@interjay所说,它期待一个callble,但是你真的不需要为此定义一个命名函数,lambda会这样做:
self.assertRaises(SomeException, lambda: my_instance.some_property)
答案 4 :(得分:-1)
您收到错误,因为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()