声明由@ propertyname.setter生成的异常

时间:2019-08-06 15:55:53

标签: python unit-testing properties assert testcase

源代码

我有一些代码要求我调用一个属性设置器来测试某个类的功能是否起作用(该类的某些功能为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.__padlockTrue,则会引发RuntimeError。尝试使用python unittest声明setter时出现问题。

问题

似乎unittest缺少断言是否需要属性设置程序引发异常的功能。

尝试使用assertRaises显然无效:

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

问题

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

1 个答案:

答案 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')

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