2011-04-13 4 views
0

Je suis en train de test unitaire une application Django et dans le processus se moquant un appel de base de données à l'aide Mock comme suit (où Record est un modèle Django):Mocking base de données Django appelle

Record.objects.get = Mock() 
Record.objects.get.side_effect = Exception("Record.DoesNotExist") # Exception as a string 

et je rattrape l'exception comme suit:

except Record.DoesNotExist: 
    return HttpResponseRedirect("http://www.somesite.com") 

Puis-je obtenir l'erreur suivante sur l'exécution du test:

Exception: Record.DoesNotExist 

Si au contraire je me moque l'exception comme suit:

Record.objects.get.side_effect = Exception(Record.DoesNotExist) # Exception as a class 

Puis-je obtenir l'erreur suivante sur l'exécution du test:

Exception: <class 'supersales.plugin.models.DoesNotExist'> 

Quelqu'un pourrait-il expliquer pourquoi ne peut-il attraper l'exception même en cas de un bloc try-except.

Répondre

2

Vous faites deux choses différentes, qui ne sont pas les mêmes que le fait de lever l'exception Record.DoesNotExist. Vous pouvez les essayer dans votre console pour voir.

La première est l'exception d'exception de classe (la classe de base pour toutes les exceptions), avec le message "Record.DoesNotExist". Votre essai/except ne l'attrape pas parce que (correctement) attrape seulement la classe réelle DoesNotExist.

La seconde déclenche également une exception de classe Exception, sauf que cette fois le message est la classe Record.DoesNotExist. Encore une fois, le try/except ne l'attrape pas parce que la classe de l'exception - par opposition au message - est fausse.

, il vous suffit de passer au lieu de la classe d'exception réelle à la side_effect:

Record.objects.get.side_effect = Record.DoesNotExist 
+0

Oui, je compris cela après un certain temps. Comme cela aurait dû être évident, je suis un débutant Python. Merci beaucoup pour votre réponse si. – Rohit

Questions connexes