【问题标题】:Set unit test for raised exception in property setter在属性设置器中为引发的异常设置单元测试
【发布时间】:2020-08-02 05:10:10
【问题描述】:

如果输入不是预期的类型,我正在使用属性设置器并引发错误。我也在对所有函数进行单元测试,并想测试在使用 setter 时是否确实引发了异常。

我尝试获取一个可调用的对象给unittest.TestCase.assertRaises。这是一个例子:

import unittest

class A:
    def __init__(self, num):
        self.var = num

    @property
    def var(self):
        return self._var

    @var.setter
    def var(self, new):
        if not isinstance(new, int):
            raise TypeError
        self._var = new

class TestA(unittest.TestCase):
    def test_a_setter(self):
        a = A(5)
        self.assertRaises(TypeError, a.var = 'a') #<--- a not working try

if __name__ == '__main__':
    unittest.main()

有没有办法让 setter 可调用?否则,我将只使用 try ... except 块,但这看起来不是一个干净的解决方案。

我得到的另一个想法是使用setattr,但这不适用于属性。

【问题讨论】:

    标签: python unit-testing properties callable


    【解决方案1】:

    使用assertRaises 的上下文管理器变体应该可以工作:

    class TestA(unittest.TestCase):
        def test_a_setter(self):
            a = A(5)
            with self.assertRaises(TypeError):
                a.var = 'a'
    

    这也使测试在大多数情况下更具可读性,因此我通常更喜欢这种风格。

    为了完整起见,这里是您实际问题的(丑陋的)答案:

    class TestA(unittest.TestCase):
        def test_a_setter(self):
            a = A(5)
            self.assertRaises(TypeError, A.var.__set__, a, 'a')
            # alternative using lambda:
            self.assertRaises(TypeError, lambda: A.var.__set__(a, 'a'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2013-03-03
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2021-07-14
      相关资源
      最近更新 更多