如何使用assertRaises()捕获“TypeError”

时间:2014-04-03 16:15:22

标签: python unit-testing assert

我想捕获代码生成的TypeError,但不幸的是,unittest失败了:

以下是代码:

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 个答案:

答案 0 :(得分:9)

取消引用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")                                

答案 1 :(得分:3)

你可以这样做:

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

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