python - 在属性设置器中为引发的异常设置单元测试
问题描述
如果输入不是预期的类型,我正在使用属性设置器并引发错误。我也在对所有函数进行单元测试,并想测试在使用 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
,但这不适用于财产。
解决方案
使用上下文管理器变体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'))
推荐阅读
- reactjs - TypeError:books.map 不是函数反应
- r - 使用列表搜索数据框列中的列
- database - Laravel 多态关联
- android - Ract native gl - 纹理无法在发布版本中读取图像资产(没有 Metro 服务器)
- javascript - 如何使用 Node.js 通过代理发送 HTTP/2 请求?
- php - PHP array_filter 在没有键的情况下获取值
- angular - 在Angular 9中以文本形式获取Http Post响应
- c# - 如何将 GET 方法的值保存在数组中,然后访问特定值
- arrays - How to put a group of changes to an array and then print all of them as one in C
- java - 为什么 Timer 在 for 循环中不起作用?