2014-12-04 105 views
0

我有這個奇怪的麻煩在Python運行我的unittest: 我用assertRaises,並運行unittest引發正確的異常,但測試仍然失敗。好吧,我真的不能解釋它,請看看自己的回溯:Python單元測試聲明錯誤

Error 
Traceback (most recent call last): 
File "/Users/chianti/PycharmProjects/Programming_Project/Part1and4/Part1and4Test.py", line 32, in test_non_alpha_name 
self.assertRaises(RestNameContainNonAlphaError, RestaurantName(self.non_alpha_name)) 
File "/Users/chianti/PycharmProjects/Programming_Project/Part1and4/InputCheck.py", line 29, in __init__ 
raise RestNameContainNonAlphaError('There are non alphabetic characters that I can not recognize!') 
RestNameContainNonAlphaError: There are non alphabetic characters that I can not recognize! 


Error 
Traceback (most recent call last): 
File "/Users/chianti/PycharmProjects/Programming_Project/Part1and4/Part1and4Test.py", line 24, in test_non_string_name 
self.assertRaises(InputNotStringError, RestaurantName, self.non_string_name) 
File "/Users/chianti/anaconda/lib/python2.7/unittest/case.py", line 473, in assertRaises 
callableObj(*args, **kwargs) 
File "/Users/chianti/PycharmProjects/Programming_Project/Part1and4/InputCheck.py", line 33, in __init__ 
raise InputNotStringError('Not String! The input is supposed to be a string type!') 
InputNotStringError: Not String! The input is supposed to be a string type! 

爲什麼??????????任何想法都很感謝! THANK YOU


這裏是我的單元測試:

class RestaurantNameTests(unittest.TestCase): 

def setUp(self): 

    self.non_string_name = 123 
    self.valid_name = 'Italian rest ' 
    self.non_alpha_name = 'valid ** n' 

def tearDown(self): 

    self.non_string_name = None 
    self.valid_name = None 
    self.non_alpha_name = None 

def test_non_string_name(self): 

    with self.assertRaises(InputNotStringError): 
     RestaurantName(self.non_string_name) 

def test_valid_name(self): 

    self.assertEqual(RestaurantName(self.valid_name).__str__(), 'Italian rest') 

def test_non_alpha_name(self): 

    self.assertRaises(RestNameContainNonAlphaError, RestaurantName(self.non_alpha_name)) 

如果你需要看RestaurantName的定義,那就是:

class RestaurantName(): 

def __init__(self, input_contents): 

    self.name = input_contents 

    if IsValidString(self.name): 

     self.no_space_name = self.name.replace(' ', '') 

     if str.isalpha(self.no_space_name): 
      pass 
     else: 
      raise RestNameContainNonAlphaError('There are non alphabetic characters that I can not recognize!') 

    else: 

     raise InputNotStringError('Not String! The input is supposed to be a string type!') 

def __repr__(self): 

    return 'RestaurantName(%s)' % self.name.strip() 

def __str__(self): 

    return self.name.strip() 

再次感謝

+0

請在'Part1and4Test.py'中向我們展示'test_non_alpha_name'功能。 – Kevin 2014-12-04 16:55:15

+0

我很抱歉。對於我的第一個問題描述版本中的錯誤,我表示抱歉。我更新了我的問題。謝謝:) – Chianti5 2014-12-04 17:39:00

回答

2

回溯與您對問題的描述不符(也不符合您的代碼FWIW)。你得到的錯誤是在test_non_alpha_name()你沒有張貼但是從你的錯誤信息是這樣:

self.assertRaises(
    RestNameContainNonAlphaError, 
    RestaurantName(self.non_alpha_name) 
    ) 

這是不使用assertRaises()的正確方法。您必須通過ExpectedExceptionClass, callable, *args, **kwassertRaisesargskw將傳遞給您的可調用。督察你想:

self.assertRaises(
    RestNameContainNonAlphaError, 
    RestaurantName, 
    self.non_alpha_name 
    ) 

原因很簡單:你現在把它的方式,在異常觸發之前調用assertRaises

補充說明:

  • 您的拆卸方法是沒用的
  • 已經有一個爲錯誤類型的一個內置的例外,它的命名TypeError
  • 有也是錯誤的價值觀一個內建的異常被命名爲ValueError
+0

謝謝sooooo多!對於我的第一個問題描述版本中的錯誤,我表示抱歉。你的解釋是完美的!現在我更瞭解assertRaises,更好的是,我學習了TypeError和ValueError。 – Chianti5 2014-12-04 17:23:06

+0

我很抱歉,我嘗試過TypeError和ValueError,他們在我的單元測試中工作得很好。但是當我使用'self.assertRaises( RestNameContainNonAlphaError, RestaurantName, self.non_alpha_name )'我仍然有同樣的錯誤。這與我對RestaurantName的定義有什麼關係?非常感謝。 – Chianti5 2014-12-04 17:37:44

+0

@Chianti5:如果您在測試中的代碼中引發ValueError,並且在測試代碼中出現RestNameContainNonAlphaError,那麼測試顯然會失敗。我提到了這些例外,因爲它們已經存在,是標準的,並且適合您的使用情況,但是如果您願意,可以重新發明輪子;) – 2014-12-04 18:41:02