2013-04-16 4 views
3

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

Вот тестовый модуль:

def test900_001_ShouldRaiseExceptionDuplicateID(self): 
    hist = projecthistory.ProjectHistory() 
    myProject = project.Project(id = 42, locR = 10, locP = 15, locA = 30, eP = 200, eA= 210) 
    hist.addProject(myProject) 
    myProject2 = project.Project(id = 42, locR = 15, locP = 25, locA = 40, eP = 300, eA = 410) 
    self.assertRaises(ValueError, projecthistory.ProjectHistory, hist.addProject(myProject2)) 

Вот код, что это относится к:

def addProject(self, proj): 

    duplicate = False 
    checkId = proj.getId() 

    #check to see if that id is already in the container if so, raise ValueError 
    #append project to container 
    for project in self.theContainer: 
     if (project.getId() == checkId): 
      duplicate = True 
      break 
    if(duplicate == False): 
     self.theContainer.append(proj) 
    else: 
     raise ValueError("ProjectHistory.addProject: Duplicate ID found. Project not added to repository.") 

    return len(self.theContainer) 

В основном, проекты добавляются в список под названием theContainer. Однако, если два идентификатора совпадают, дубликат не добавляется. Вызывая добавление двух проектов с тем же идентификатором в единичном тесте, который будет добавлен, возникает исключение.

Вот в отслеживающий, что я получаю:

Traceback (most recent call last): 

    File "C:\Users\blah\workspace\blahID\CA06\test\projecthistoryTest.py", line 46, in test900_001_ShouldRaiseExceptionDuplicateID 
    self.assertRaises(ValueError, projecthistory.ProjectHistory, hist.addProject(myProject2)) 

    File "C:\Users\blah\workspace\blahID\CA06\prod\projecthistory.py", line 38, in addProject 
    raise ValueError("ProjectHistory.addProject: Duplicate ID found. Project not added to repository.") 
ValueError: ProjectHistory.addProject: Duplicate ID found. Project not added to repository. 

Может быть проблема с третьим параметром в assertRaises? (hist.addProject (myProject2))

ответ

4

Ваши подозрения верны, и проблема заключается в вызове hist.addProject().

Вы писали:

self.assertRaises(ValueError, projecthistory.ProjectHistory, 
    hist.addProject(myProject2)) 

Существует ValueError поднят. Но он находится в

hist.addProject(myProject2) 

След сообщает об этом. И поэтому assertRaises никогда не называется, потому что исключение возникает до того, как оно вызвано.

Способ думать об этом заключается в том, что assertRaises может перехватывать исключения только в том случае, если ему действительно называться. Если акт подготовки своих аргументов вызывает исключение, то assertRaises даже не запускается, и поэтому ничего не может поймать.

Если вы ожидаете, исключение в вызове addProject() просто изменить свое утверждение:

self.assertRaises(ValueError, hist.addProject, myProject2) 

Или вы могли бы отложить вызов hist.addProject() с лямбда:

self.assertRaises(ValueError, 
    lambda: projecthistory.ProjectHistory(hist.addProject(myProject2))) 
+0

Azmazing! Это все исправило. – SwaroopGiwali