断言@propertyname.setter 生成的异常

Rob*_*ith 2 python unit-testing assert properties testcase

源代码

我有一些代码要求我调用属性设置器来测试类的锁定功能是否正常工作(类的某些功能是async,要求在执行期间设置挂锁布尔值)。RuntimeError如果已为实例设置了锁,则已写入设置器以引发 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.")
Run Code Online (Sandbox Code Playgroud)

正如你在这里看到的,如果self.__padlockTrue,aRuntimeError被提升。尝试使用 python 断言 setter 时会出现问题unittest

问题

似乎unittest缺乏断言属性设置器是否引发异常所需的功能。

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

    # Non-working concept
    self.assertRaises(RuntimeError, my_object.filename, "testfile.txt")
Run Code Online (Sandbox Code Playgroud)

问题

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

che*_*ner 5

您需要通过赋值实际调用setter。只要您assertRaises用作上下文管理器,这很容易做到。

with self.assertRaises(RuntimeError):
    my_object.filename = "testfile.txt"
Run Code Online (Sandbox Code Playgroud)

如果您不能这样做,您将不得不退回到显式try语句(这会变得棘手,因为您需要分别处理“无异常”和“除“以外的异常)RuntimeError

try:
    my_object.filename = "testfile.txt"
except RuntimeError:
    pass
except Exception:
    raise AssertionError("something other than RuntimeError")
else:
    raise AssertionError("no RuntimeError")
Run Code Online (Sandbox Code Playgroud)

或(更多)显式调用 setter:

self.assertRaises(RuntimeError, setattr, myobject, 'filename', 'testfile.txt')
Run Code Online (Sandbox Code Playgroud)

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

self.assertRaises(RuntimeError, type(myobject).filename.fset, myobject, 'testfile.txt')
Run Code Online (Sandbox Code Playgroud)

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