Python-测试属性引发异常
鉴于: 如果Python-测试属性引发异常,python,unit-testing,properties,ironpython,Python,Unit Testing,Properties,Ironpython,鉴于: 如果do\u something抛出异常,则测试通过 但是我有一个属性,当我用c.name=“name”替换c.do\u something时,我得到一个错误,关于我的测试模块没有被导入,Eclipse突出显示了equals符号 如何测试抛出异常的属性 编辑: setattr和getattr对我来说是新的。在这种情况下,它们确实起到了帮助作用,谢谢。您遇到了一个错误,因为在Python中,在另一个表达式中有赋值是一个语法错误。例如: def test_to_check_exception
do\u something
抛出异常,则测试通过
但是我有一个属性,当我用c.name=“name”
替换c.do\u something
时,我得到一个错误,关于我的测试模块没有被导入,Eclipse突出显示了equals符号
如何测试抛出异常的属性
编辑:
setattr
和getattr
对我来说是新的。在这种情况下,它们确实起到了帮助作用,谢谢。您遇到了一个错误,因为在Python中,在另一个表达式中有赋值是一个语法错误。例如:
def test_to_check_exception_is_thrown(self):
# Arrange
c = Class()
# Act and Assert
self.assertRaises(NameError, c.do_something)
要测试属性是否引发异常,请使用try块:
>>> foo = 'bar'
>>> print(foo)
bar
assertRaises
需要一个可调用的对象。您可以创建函数并传递它:
try:
object.property = 'error'
except ExpectedError:
test_passes()
else:
test_fails()
另一种可能是使用setattr
:
obj = Class()
def setNameTest():
obj.name = "Name"
self.assertRaises(NameError, setNameTest)
原始代码会引发语法错误,因为赋值是语句,不能放在表达式中。
赋值语句(即class.name=“name”
)不是可调用语句,因此无法工作。使用setattr
这样执行赋值
self.assertRaises(NameError, setattr, obj, "name", "Name")
此外,由于类是一个关键字,因此不能将其分配给
类。因为Python 2.7和3.1assertRaises()
可以用作上下文管理器。见和
因此,您可以使用指令编写测试,如下所示:
self.assertRaises(NameError, setattr, myclass, "name", "Name")
正如@interjay所说,它需要一个可调用的函数,但实际上不需要为此定义命名函数。lambda可以做到这一点:
def test_to_check_exception_is_thrown(self):
c = Class()
with self.assertRaises(NameError):
c.name = "Name"
因为Python2.7+应该签出@RaphaelAhrens的答案如下。你能解释一下为什么这件事值得投反对票吗?也许有一个副作用我没有看到。谢谢
def test_to_check_exception_is_thrown(self):
c = Class()
with self.assertRaises(NameError):
c.name = "Name"
self.assertRaises(SomeException, lambda: my_instance.some_property)