python单元测试中的assertRaises引发未捕获异常

assertRaises in python unit-test not catching the exception

本问题已经有最佳答案,请猛点这里访问。

有人能告诉我为什么下面的单元测试在测试出错,而不是用断言引发捕获它成功了吗?我想我用的是正确的程序和语法,但是ValueError不会被捕获。

我在Linux设备上使用的是python 2.7.5。

这是密码……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import unittest

class IsOne(object):
    def __init__(self):
        pass
    def is_one(self, i):
        if (i != 1):
            raise ValueError

class IsOne_test(unittest.TestCase):

    def setUp(self):
        self.isone = IsOne()

    def test_good(self):
        self.isone.is_one(1)
        self.assertTrue(True)

    def test_bad(self):
        self.assertRaises(ValueError, self.isone.is_one(2))

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

这是单元测试的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
======================================================================
ERROR: test_bad (__main__.IsOne_test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File"test/raises.py", line 20, in test_bad
    self.assertRaises(ValueError, self.isone.is_one(2))
  File"test/raises.py", line 8, in is_one
    raise ValueError
ValueError

----------------------------------------------------------------------
Ran 2 tests in 0.008s

FAILED (errors=1)

UnitTest的断言引发需要可调用和参数,因此在您的情况下,您可以这样调用它:

1
self.assertRaises(ValueError, self.isone.is_one, 2)

如果您愿意,从python2.7开始,还可以将其用作上下文管理器,如:

1
2
with self.assertRaises(ValueError):
    self.isone.is_one(2)