assertRaises 不捕获异常/不抱怨没有异常

assertRaises does not catch exception / does not complain about no exception

此代码未按预期工作。期望失败时我却通过了;并在期望通过 assertRaises() 时失败。

test_db.py:

import unittest

class TestConnectDatabase(unittest.TestCase):
    def test_close(self):
        self.assertRaises(ReferenceError, self.close_database()) # <--- Problem #1
        pass

    # Just a stub for brevity...
    def close_database(self):
        #raise Exception(ReferenceError)                         # <--- Problem #2
        pass

if __name__ == '__main__':
    unittest.main()

在此示例中,即使未引发异常,代码也通过了单元测试。如果 #raise 未注释,则异常仅传递到命令行,并且测试在应该通过时失败。

执行测试使用: python -m test_dbpython test_db.py

您正在调用方法 self.close_database,而您本应传递对它的引用。删除括号,例如

def test_close(self):
    self.assertRaises(ReferenceError, self.close_database)

查看 the docs 了解更多详情。

去掉self.close_database后面的括号:

class TestConnectDatabase(unittest.TestCase):
    def test_close(self):
        self.assertRaises(ReferenceError, self.close_database)
        pass

您正在调用 self.close_database,这意味着它的结果 (None) 被传递给 assertRaises。请参阅 assertRaises.

的文档