Python - 测试属性抛出异常

14 投票
5 回答
5935 浏览
提问于 2025-04-15 18:02

给定的内容是:

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 个回答

8

第二个参数给 assertRaises 时应该是一个可调用的对象

比如说,像 class.name = "Name" 这样的赋值语句并不是可调用的,所以这样写是行不通的。你可以用 setattr 来进行赋值,像这样:

self.assertRaises(NameError, setattr, myclass, "name", "Name")

另外,你不能给 class 赋值,因为它是一个关键字。

18

从Python 2.7和3.1开始,assertRaises()可以作为上下文管理器使用。你可以在这里查看Python 2的相关内容:这里,以及Python 3的内容:这里

所以你可以像这样用with语句来写你的测试:

def test_to_check_exception_is_thrown(self):
    c = Class()
    with self.assertRaises(NameError):
        c.name = "Name"
17

assertRaises 需要一个可以调用的对象。你可以创建一个函数并把它传进去:

obj = Class()
def setNameTest():
    obj.name = "Name"        
self.assertRaises(NameError, setNameTest)

还有一种方法是使用 setattr

self.assertRaises(NameError, setattr, obj, "name", "Name")

你原来的代码会出现语法错误,因为赋值是一个语句,不能放在表达式里面。

撰写回答