Python unittest выдает ошибку

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

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!

Почему ?????????? Любые идеи приветствуются!!! БЛАГОДАРЮ ВАС


Вот мой юниттест:

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() 

Спасибо еще раз


person Chianti5    schedule 04.12.2014    source источник
comment
Пожалуйста, покажите нам функцию test_non_alpha_name в Part1and4Test.py.   -  person Kevin    schedule 04.12.2014
comment
Мне очень жаль. Прошу прощения за свою ошибку в первой версии описания проблемы. Я обновил свой вопрос. Спасибо :)   -  person Chianti5    schedule 04.12.2014


Ответы (1)


Трассировка не соответствует вашему описанию проблемы (и вашему коду 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
person bruno desthuilliers    schedule 04.12.2014
comment
Спасибо большое! Прошу прощения за свою ошибку в первой версии описания проблемы. Ваше объяснение идеально! Теперь я лучше разбираюсь в assertRaises и лучше изучил TypeError и ValueError. - person Chianti5; 04.12.2014
comment
Извините, я пробовал TypeError и ValueError, они отлично работали в моем юнит-тесте. Но когда я использовал self.assertRaises( RestNameContainNonAlphaError, RestaurantName, self.non_alpha_name ), я все еще получал ту же ошибку. Это как-то связано с моим определением RestaurantName?? Большое спасибо. - person Chianti5; 04.12.2014
comment
@Chianti5: если вы вызовете ValueError в тестируемом коде и ожидаете RestNameContainNonAlphaError в своем тестовом коде, то тест, очевидно, завершится ошибкой. Я упомянул эти исключения, потому что они уже существуют, являются стандартными и подходят для вашего случая использования, но вы можете изобрести велосипед, если хотите;) - person bruno desthuilliers; 04.12.2014
comment
@Chianti5: всегда пожалуйста. Не стесняйтесь принять мой ответ, если он решил вашу проблему;) - person bruno desthuilliers; 07.12.2014