2014-12-04 3 views
0

파이썬에서 unittest를 실행하는 데 이상한 문제가 발생했습니다. 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! 

왜 ?????????? 어떤 아이디어도 감사합니다 !!!

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

+0

죄송합니다. 문제 설명의 첫 번째 버전에서 실수 한 것에 대해 사과드립니다. 나는 내 질문을 업데이트했다. 고마워요. – Chianti5

답변

2

역 추적 당신을 여기


내 유닛 테스트 감사합니다 문제에 대한 설명 (코드 FWIW)과 일치하지 않습니다. 당신이 얻을 오류는 게시하지 않았다 test_non_alpha_name()에 있지만처럼 오류를 메시지가 보이는 :이 assertRaises()을 사용하는 올바른 방법이 아니다

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

. ExpectedExceptionClass, callable, *args, **kwassertRaises으로 전달해야하며 argskw이 호출 가능 대상으로 전달됩니다. IOW 당신이 원하는 :

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

이유는 간단하다 : 당신은 그것을 호출하는 방법은, 예외가 전에 assertRaises에 대한 호출을 을 트리거됩니다. 보조 노트로

:

  • 당신의 해체 방법은 쓸모가
  • ,이
  • ValueError라는 잘못된 값에 대한 내장 예외도있다 TypeError라는 이름의 잘못 유형에 대한 내장 예외가 이미있다
+0

고맙습니다. 문제 설명의 첫 번째 버전에서 실수 한 것에 대해 사과드립니다. 당신의 설명은 완벽합니다! 이제 저는 assertRaises에 대해 더 잘 알고 있습니다. 그리고 더 나은 방법으로 TypeError와 ValueError를 배웠습니다. – Chianti5

+0

죄송합니다. TypeError 및 ValueError를 시도했는데, 그들은 unittest에서 정상적으로 작동했습니다. 그러나'self.assertRaises ( RestNameContainNonAlphaError, RestaurantName, self.non_alpha_name ) '를 사용했을 때 여전히 같은 오류가 발생했습니다. 내 정의 RestaurantName과 관련이 있습니까 ?? 정말 고맙습니다. – Chianti5

+0

@ Chianti5 : 테스트중인 코드에서 ValueError를 발생시키고 테스트 코드에서 RestNameContainNonAlphaError를 예상하면 테스트가 매우 분명히 실패합니다. 나는 이미 존재하기 때문에 이러한 예외를 언급, 표준, 그리고 당신을 위해 approriate 경우 사용하지만 당신이 선호하는 경우 바퀴를 reinvent 수 있습니다;) –