Python 使用unittest测试任务失败

Python 使用unittest测试任务失败,python,unit-testing,properties,variable-assignment,assertraises,Python,Unit Testing,Properties,Variable Assignment,Assertraises,我的一个属性是一个属性,在该属性中,setter调用验证函数,如果新值无效,该函数将引发异常: pos.offset = 0 # @offset.setter calls validate(offset=0) # PositionError: Offset may not be 0. 我正在尝试添加一个测试以确保失败。但是,我不知道如何让assertRaises处理作业 assertRaises的正常语法需要方法,而不是属性: self.assertRaises(PositionError,

我的一个属性是一个属性,在该属性中,setter调用验证函数,如果新值无效,该函数将引发异常:

pos.offset = 0
# @offset.setter calls validate(offset=0)
# PositionError: Offset may not be 0.
我正在尝试添加一个测试以确保失败。但是,我不知道如何让assertRaises处理作业

assertRaises的正常语法需要方法,而不是属性:

self.assertRaises(PositionError, pos.offset, 0)
# TypeError: 'int' object is not callable
我尝试过的其他形式是无效的Python:

self.assertRaises(PositionError, pos.offset = 0)
# SyntaxError: Keyword can't be an expression
self.assertRaises(PositionError, lambda: pos.offset = 0)
# SyntaxError: lambda cannot contain assignment
如何测试属性分配失败?


注意:Python2.6,我知道unittest在Python2.7之前的2.7中有一些新功能,

您想使用
setattr(对象、名称、值)
。这允许您为属性设置值

self.assertRaises(PositionError, setattr, pos, "offset", 0)
# ... ok

这应该始终有效,因为如果属性是属性,因此“秘密”调用函数,那么它必须在类中。我不认为标准赋值会失败(尽管右侧的表达式可能会失败,即
x=1/0
)。

当您想使用
unittest
来测试代码块中是否发生异常而不仅仅是函数调用时,您可以使用
assertRaises
作为上下文管理器:

with self.assertRaises(PositionError):
    pos.offset = 0
此用法可在中找到


虽然这在Python2.6中不可用,也不适用于您(我刚刚看到了您的注释),但我认为它值得包含在答案中,因为它可能是Python2.7+实现这一点的更清晰的方法。

赋值可能会因各种原因而失败(例如,添加一个不在
\uuuuuuuu slots\uuu
中的属性),即使您没有描述符,但这是正确的答案。