Python - 测试属性抛出异常

时间:2010-01-14 17:38:10

标签: python unit-testing properties ironpython

假设:

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突出显示了等号。

如何测试属性会引发异常?

修改

setattrgetattr对我来说是新手。在这种情况下,他们肯定有所帮助,谢谢。

5 个答案:

答案 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 2here 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()