2011-08-07 5 views
8

Je courais dans le problème suivant plutôt étrange:assertRaises échoue, même exception est levée

Je développe une application django et je suis en train de définir une exception qui devrait être soulevée dans mes modèles classe quand une validation échoue:

class MissingValueException(Exception): 
"""Raise when a required attribute is missing.""" 
def __init__(self, message): 
    super(MissingValueException, self).__init__() 
    self.message = message 

def __str__(self): 
    return repr(self.message) 

Ce code est appelé d'une classe de publication dans une méthode de validation:

def validate_required_fields(self): 
    # Here is the validation code. 
    if all_fields_present: 
     return True 
    else: 
     raise MissingValueException(errors) 

dans mon test unitaire je crée un cas où doit être soulevé l'exception:

def test_raise_exception_incomplete_publication(self): 
    publication = Publication(publication_type="book") 
    self.assertRaises(MissingValueException, publication.validate_required_fields) 

Ceci produit la sortie suivante:

====================================================================== 
ERROR: test_raise_exception_incomplete_publication (core_knowledge_platform.core_web_service.tests.logic_tests.BusinessLogicTests) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
File "/media/data/Dokumente/Code/master_project/core_knowledge_platform/../core_knowledge_platform/core_web_service/tests/logic_tests.py", line 45, in test_raise_exception_incomplete_publication 
    self.assertRaises(MissingValueException, method,) 
File "/usr/lib/python2.7/unittest/case.py", line 465, in assertRaises 
    callableObj(*args, **kwargs) 
File "/media/data/Dokumente/Code/master_project/core_knowledge_platform/../core_knowledge_platform/core_web_service/models.py", line 150, in validate_required_fields 
    raise MissingValueException(errors) 
MissingValueException: 'Publication of type book is missing field publisherPublication of type book is missing field titlePublication of type book is missing field year' 

Il semble donc que l'exception est soulevée (ce qui est le cas - j'ai même vérifié dans une session IPython interactive), mais il semble que assertRaises ne l'attrape pas.

Quelqu'un a une idée de ce qui pourrait arriver?

Merci

Répondre

6

Cela pourrait se produire si vos tests et votre code de produit sont l'importation de votre classe d'exception par deux chemins différents, de sorte asserRaises ne se rendent pas compte que l'exception que vous avez obtenu était celui que vous recherchez.

Regardez vos importations, assurez-vous qu'elles sont identiques aux deux endroits. Avoir les mêmes répertoires disponibles de deux manières différentes dans votre PYTHONPATH peut y arriver. Des liens symboliques dans ces entrées peuvent également créer des confusions.

+0

Oui, c'était le problème - l'exception déclenchée était: . .models.Exception Alors que le prévu était seulement: .models.Exception – BergmannF

+0

Eh ... J'ai ce problème avec un 'AssertionError' - J'utilise' self.assertRaises (AssertionError, ...) ', et il échoue toujours avec un' AssertionError'. Puisque c'est dans le noyau python, ceci ne peut pas être la réponse. D'autres possibilités? – naught101

+0

Peu importe, c'était une erreur séparée. Leçon: Faites très attention aux numéros de ligne dans la sortie de test. – naught101

Questions connexes