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.1
assertRaises()
可以用作上下文管理器。见和

因此,您可以使用
指令编写测试,如下所示:

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)