首页 > 解决方案 > 在属性设置器中为引发的异常设置单元测试

问题描述

如果输入不是预期的类型,我正在使用属性设置器并引发错误。我也在对所有函数进行单元测试,并想测试在使用 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,但这不适用于财产。

标签: pythonunit-testingpropertiescallable

解决方案


使用上下文管理器变体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'))

推荐阅读