2013-04-16 55 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