2014-12-04 4 views
0

У меня была эта странная проблема с запуском моего unittest в Python: Я использовал assertRaises, и запуск unittest поднял правильное исключение, но тест по-прежнему не удался. Хорошо, я не могу это объяснить, пожалуйста, просмотрите трассировку:Python unittest assertraises error

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! 

Почему ?????????? Любые идеи оцениваются !!! СПАСИБО


Вот мой UnitTest:

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

Пожалуйста, покажите нам функцию 'test_non_alpha_name' в' Part1and4Test.py'. – Kevin

+0

Мне очень жаль. Прошу прощения за мою ошибку в первой версии описания проблемы. Я обновил свой вопрос. Спасибо :) – Chianti5

ответ

2

отслеживающий не соответствует вашему описанию проблемы (а не вашему коду FWIW). Ошибка, которую вы получаете в test_non_alpha_name(), которые вы не отправляли, а из вашей ошибки сообщение выглядит следующим образом:

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

Это не правильный способ использования assertRaises(). Вы должны пройти ExpectedExceptionClass, callable, *args, **kw до assertRaises, и args и kw будут переданы вашему вызываемому. IOW вы хотите:

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

Причина проста: как вы в настоящее время называют его, исключение запускается перед тем вызов assertRaises.

В качестве примечания:

  • вашего метод Teardown бесполезно
  • уже есть встроенное исключение для неправильных типов, он называется TypeError
  • есть также встроенное исключение для неправильных значений, который назван ValueError
+0

Большое спасибо! Прошу прощения за мою ошибку в первой версии описания проблемы. Ваше объяснение прекрасное! Теперь я лучше знаю assertRaises, и лучше, я изучил TypeError и ValueError. – Chianti5

+0

Прошу прощения, я попробовал TypeError и ValueError, они отлично работали в моем unittest. Но когда я использовал 'self.assertRaises ( RestNameContainNonAlphaError, RestaurantName, self.non_alpha_name )' У меня по-прежнему такая же ошибка. Это имеет какое-то отношение к моему определению RestaurantName ?? Огромное спасибо. – Chianti5

+0

@ Chianti5: если вы повышаете ValueError в тестируемом коде и ожидаете RestNameContainNonAlphaError в своем тестовом коде, тогда тест, очевидно, будет терпеть неудачу. Я упоминал эти исключения, потому что они уже существуют, являются стандартными и подходят для использования вами, но вы можете изобрести колесо, если хотите;) –

Смежные вопросы