我有一些代码要求我调用一个属性设置器来测试某个类的功能是否起作用(该类的某些功能为async
,要求在其运行期间设置一个挂锁布尔值)。执行)。如果已经为实例设置了锁定,则写了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.__padlock
为True
,则会引发RuntimeError
。尝试使用python unittest
声明setter时出现问题。
似乎unittest
缺少断言是否需要属性设置程序引发异常的功能。
尝试使用assertRaises
显然无效:
# Non-working concept
self.assertRaises(RuntimeError, my_object.filename, "testfile.txt")
如何断言类的属性设置器将在python unittest.TestCase
方法中引发给定的异常?
答案 0 :(得分:1)
您需要通过分配实际调用设置器。只要您使用assertRaises
作为上下文管理器,此操作就很简单。
with self.assertRaises(RuntimeError):
my_object.filename = "testfile.txt"
如果您无法执行此操作,则必须使用明确的try
语句(这很棘手,因为您需要同时处理“无例外”和“ {{1}以外的其他例外) }”。
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')
换句话说,为上下文管理者欢呼三声!