Python - 测试属性抛出异常

Fin*_*las 11 python ironpython unit-testing properties

鉴于:

def test_to_check_exception_is_thrown(self):
    # Arrange
    c = Class()
    # Act and Assert
    self.assertRaises(NameError, c.do_something)
Run Code Online (Sandbox Code Playgroud)

如果do_something抛出异常则测试通过.

但是我有一个属性,当我替换时c.do_something,c.name = "Name"我得到一个关于我的测试模块没有被导入的错误,Eclipse突出显示了等号.

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

编辑:

setattr并且getattr是新的我.在这种情况下,他们肯定有所帮助,谢谢.

int*_*jay 17

assertRaises期待一个可调用的对象.您可以创建一个函数并传递它:

obj = Class()
def setNameTest():
    obj.name = "Name"        
self.assertRaises(NameError, setNameTest)
Run Code Online (Sandbox Code Playgroud)

另一种可能性是使用setattr:

self.assertRaises(NameError, setattr, obj, "name", "Name")
Run Code Online (Sandbox Code Playgroud)

您的原始代码会引发语法错误,因为赋值是一个语句,不能放在表达式中.

  • 因为python 2.7+应该签出@RaphaelAhrens回答如下.它更加pythonic http://stackoverflow.com/a/23650764/601245 (2认同)

Rap*_*ens 12

由于Python 2.7和3.1 assertRaises()可以用作上下文管理器.请参阅此处的Python 2Python3.

所以你可以用这样的with指令编写你的测试:

def test_to_check_exception_is_thrown(self):
    c = Class()
    with self.assertRaises(NameError):
        c.name = "Name"
Run Code Online (Sandbox Code Playgroud)


Nou*_*him 8

第二个参数assertRaises应该是可调用的.

赋值语句(即.class.name = "Name")不是可调用的,因此它不起作用.使用setattr执行像这样的分配

self.assertRaises(NameError, setattr, myclass, "name", "Name")
Run Code Online (Sandbox Code Playgroud)

此外,您无法分配,class因为它是一个关键字.