为什么AssertRaises会持久引用超出测试函数范围的对象?

时间:2015-06-26 21:42:27

标签: python python-3.x

我有一些代码检查属性以确保它可以转换为整数。它通过添加try / except块然后引发更具信息性的异常来实现。但是,当我使用AssertRaises检查我的测试中的异常时,不会调用该对象的析构函数!我无法弄清楚对象的引用是如何在测试函数范围之外存活的。有谁知道幕后发生了什么才能实现这一目标?

这是我的代码被剥离到了失败:

class Dummy:
    def __init__(self):
        print("initing")
    def __del__(self):
        print("deleting")
    def f(self, val):
        try:
            int(val)
        except:
            raise Exception("what?")

class MyTest(unittest.TestCase):

    def test_dummy(self):
        print("Starting test")
        d = Dummy()
        self.assertRaisesRegex(Exception,
            "what?",
            d.f,
            'one',
            )
        print("Ending test")

这是测试输出:

Starting test
initing
Ending test
----------------------------------------------------------------------
Ran 1 tests in 0.001s

请注意,它不会打印'删除'

只有在我的函数的异常块中引发异常时才会发生这种情况。如果我使用if / else并引发异常,则不会发生这种情况。

当使用常规的旧AssertRaises时也会发生这种情况,当使用AssertRaises作为上下文时会发生这种情况。

0 个答案:

没有答案