2014-04-03 50 views
1

我要赶在代码生成一个类型错误,但不幸的是,单元测试失败:如何捕捉“类型错误”与assertRaises()

下面是代码:

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) 

回答

7

引文结束的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")         
+0

看你的例子后,我意识到,我在'TypeError'周围放了''''这就是为什么我的注释代码不起作用。 – Vor

2

你会做得一样:

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

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