如何用assertRaises()捕获“TypeError”

4 投票
2 回答
5340 浏览
提问于 2025-04-18 01:12

我想要捕捉代码产生的类型错误,但不幸的是,单元测试失败了:

这是代码:

import unittest                                                                 

class _Foo(object):                                                             
    def __init__(self):                                                         
        self.bar = ['AAA']                                                      

    def _validate_bar(self, bar):                                               
        if not isinstance(bar, list):                                           
            raise TypeError                                                     
        return True                                                             

class Foo(_Foo):                                                                
    def __init__(self, bar=None):                                               
        super(Foo, self).__init__()                                             
        if bar and self._validate_bar(bar):                                     
            self.bar = bar                                                      

class FooTest(unittest.TestCase):                                               

    def test_bar_as_string(self):                                               
        self.assertRaises("TypeError", Foo("a"))                                

    #def test_a(self):                                                          
    #    try:                                                                   
    #        Foo('a')                                                           
    #    except Exception as exc:                                               
    #        self.assertEqual('TypeError', exc.__class__.__name__)              

    #def test_bar_as_string(self):                                              
    #    with self.assertRaises("TypeError"):                                   
    #        Foo("a")                                                           

if __name__ == "__main__":                            

这是错误信息:

test_bar_as_string (__main__.FooTest) ... ERROR

======================================================================
ERROR: test_bar_as_string (__main__.FooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 21, in test_bar_as_string
    self.assertRaises("TypeError", Foo("a"))
  File "test.py", line 15, in __init__
    if bar and self._validate_bar(bar):
  File "test.py", line 9, in _validate_bar
    raise TypeError
TypeError

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)



    unittest.main(verbosity=2)   

2 个回答

3

你可以这样做:

with self.assertRaises(TypeError):
    Foo("a")

或者这样:

self.assertRaises(TypeError, Foo, "a")
10

TypeError的引号去掉,不要直接调用Foo,而是把这个函数(类Foo)和参数传进去。

def test_bar_as_string(self):                                               
    self.assertRaises(TypeError, Foo, "a")

或者,你可以把assertRaises当作上下文管理器来使用:

def test_bar_as_string(self):                                               
    with self.assertRaises(TypeError):
        Foo("a")                                

撰写回答