【问题标题】:Python - test a property throws exceptionPython - 测试属性抛出异常
【发布时间】:2011-01-05 04:32:01
【问题描述】:

给定:

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 对我来说是新的。他们肯定在这种情况下提供了帮助,谢谢。

【问题讨论】:

    标签: python unit-testing properties ironpython


    【解决方案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()
    

    【讨论】:

      【解决方案2】:

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

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

      另一种可能是使用setattr

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

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

      【讨论】:

      【解决方案3】:

      The second argument to assertRaises should be a callable.

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

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

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

      【讨论】:

        【解决方案4】:

        从 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"
        

        【讨论】:

          【解决方案5】:

          正如@interjay 所说,它需要一个可调用的,但您实际上并不需要为此定义一个命名函数。一个 lambda 会做到这一点:

          self.assertRaises(SomeException, lambda: my_instance.some_property)
          

          【讨论】:

          • 你能解释一下为什么这值得投反对票吗?我可能会遗漏一个副作用。谢谢
          猜你喜欢
          • 2020-08-18
          • 2014-05-10
          • 1970-01-01
          • 2013-09-08
          • 2018-03-31
          • 2020-12-21
          • 2015-06-04
          • 2014-03-25
          • 1970-01-01
          相关资源
          最近更新 更多