python - 断言由 @propertyname.setter 生成的异常
问题描述
源代码
我有一些代码需要我调用一个属性设置器来测试一个类的锁定功能是否正常工作(该类的一些函数是async
,要求在执行期间设置一个挂锁布尔值)。RuntimeError
如果已为实例设置了锁,则已编写 setter 以引发 a 。
这是代码:
@filename.setter
def filename(self, value):
if not self.__padlock:
self.__filename = value
else:
self.__events.on_error("data_store is locked. you should be awaiting safe_unlock if you wish to "
"change the source.")
正如您在此处看到的,如果self.__padlock
是True
,则 aRuntimeError
被提出。尝试使用 python 断言设置器时会出现问题unittest
。
问题
似乎unittest
缺少断言属性设置器是否引发异常所需的功能。
尝试使用assertRaises
显然不起作用:
# Non-working concept
self.assertRaises(RuntimeError, my_object.filename, "testfile.txt")
问题
如何断言类的属性设置器将在 pythonunittest.TestCase
方法中引发给定的异常?
解决方案
您需要通过分配实际调用设置器。这很简单,只要您assertRaises
用作上下文管理器。
with self.assertRaises(RuntimeError):
my_object.filename = "testfile.txt"
如果你不能这样做,你将不得不回退到一个明确的try
声明(这会变得很棘手,因为你需要分别处理“无异常”和“除异常之外的异常RuntimeError
”。
try:
my_object.filename = "testfile.txt"
except RuntimeError:
pass
except Exception:
raise AssertionError("something other than RuntimeError")
else:
raise AssertionError("no RuntimeError")
或(更多)显式调用设置器:
self.assertRaises(RuntimeError, setattr, myobject, 'filename', 'testfile.txt')
或者更糟糕的是,显式调用 setter:
self.assertRaises(RuntimeError, type(myobject).filename.fset, myobject, 'testfile.txt')
换句话说,为上下文管理器欢呼三声!
推荐阅读
- java - 强制包装在 Reactor Flux.using 中抛出的每个函数
- python-3.x - Pyinstaller 无法加载本机模块“Crypto.Cipher.__raw_ecb”
- excel - 如何在excel中查找日期时间是否小于24小时
- javascript - react-big-calendar:无法读取未定义的属性“0”
- cmake - Cmake:CMAKE_C_LINK_EXECUTABLE 变量并添加链接器选项
- mysql - mysql : 使 mysql db 对查询区分大小写
- uwp - DeviceWatcher 和 BluetoothLEAdvertisementWatcher 类和 Timeout 属性之间的区别
- powershell - PowerShell:根据特定列中值的长度删除一行
- excel - VB:加载类型库/DLL 时出错。(来自 HRESULT 的异常:0x80029C4A(TYPE_E_CANTLOADLIBRARY)
- content-management-system - Magnolia CMS - 集成第三方系统