gpt4 book ai didi

python - 断言由 @propertyname.setter 生成的异常

转载 作者:行者123 更新时间:2023-12-01 21:55:48 27 4
gpt4 key购买 nike

源代码

我有一些代码要求我调用一个属性 setter 来测试一个类的锁定功能是否正常工作(该类的一些函数是async,要求挂锁 bool 值是在执行期间设置)。如果已为实例设置锁,则已编写 setter 以引发 RuntimeError

代码如下:

    @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.__padlockTrue,则会引发 RuntimeError。尝试使用 python unittest 断言 setter 时会出现问题。

问题

unittest 似乎缺少断言属性 setter 是否引发异常所需的功能。

尝试使用 assertRaises 显然不起作用:

    # Non-working concept
self.assertRaises(RuntimeError, my_object.filename, "testfile.txt")

问题

如何断言类的属性 setter 将在 python unittest.TestCase 方法中引发给定的异常?

最佳答案

您需要通过赋值实际调用 setter。这很简单,只要你使用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")

或(更多)显式调用 setter :

self.assertRaises(RuntimeError, setattr, myobject, 'filename', 'testfile.txt')

或者更糟的是,显式调用 setter :

self.assertRaises(RuntimeError, type(myobject).filename.fset, myobject, 'testfile.txt')

换句话说,为上下文管理器欢呼三声!

关于python - 断言由 @propertyname.setter 生成的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57379888/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com