代码之家  ›  专栏  ›  技术社区  ›  Finglas

python-测试属性引发异常

  •  11
  • Finglas  · 技术社区  · 14 年前

    鉴于:

    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将突出显示equals符号。

    如何测试属性引发异常?

    编辑:

    setattr getattr 对我来说是新的。他们在这件事上肯定帮了忙,谢谢。

    5 回复  |  直到 7 年前
        1
  •  14
  •   danio Kouga    10 年前

    assertRaises 需要可调用对象。您可以创建一个函数并传递它:

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

    另一种可能是使用 setattr :

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

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

        2
  •  10
  •   Raphael Ahrens    7 年前

    从python 2.7和3.1开始 assertRaises() 可以用作上下文管理器。见 here for Python 2 here for Python3 .

    所以你可以用 with 如下说明:

    def test_to_check_exception_is_thrown(self):
        c = Class()
        with self.assertRaises(NameError):
            c.name = "Name"
    
        3
  •  8
  •   danio Kouga    10 年前

    The second argument to assertRaises should be a callable .

    转让声明(即 class.name = "Name" )不是可调用的,因此它将不起作用。使用 setattr 像这样执行任务

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

    此外,您不能将分配给 class 因为它是一个关键字。

        4
  •  0
  •   Luis Sieira    7 年前

    正如@interjay所说,它需要一个可调用的,但是您并不需要为此定义一个命名函数,lambda将执行此操作:

    self.assertRaises(SomeException, lambda: my_instance.some_property)
    
        5
  •  -1
  •   samtregar    14 年前

    您会得到一个错误,因为在另一个表达式中进行赋值是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()