2013-04-16 56 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列表。但是,如果兩個ID相同,則不會添加副本。通過在單元測試中強制添加兩個具有相同ID的項目,會引發異常。

這是我得到的回溯:

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) 

或者你可以用一個lambda推遲調用hist.addProject()

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

Azmazing!這改正了一切。 – SwaroopGiwali