首页 > 解决方案 > 断言由 @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.__padlockTrue,则 aRuntimeError被提出。尝试使用 python 断言设置器时会出现问题unittest

问题

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

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

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

问题

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

标签: pythonunit-testingpropertiesasserttestcase

解决方案


您需要通过分配实际调用设置器。这很简单,只要您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')

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


推荐阅读