2012-11-03 2 views
2

Donc j'apprends à pratiquer le TDD dans Django et j'ai quelques problèmes mineurs. J'ai créé un objet utilisateur personnalisé qui lie aux utilisateurs du système authentifié dans une relation un à un. Je le test suivant, qui exerce une partie de ma classe utilisateur personnalisée:Django assertEqual n'affiche pas les valeurs réelles par rapport aux valeurs attendues

def test_creating_a_user_with_attributes(self): 
    myuser = Myuser.objects.create_user('Gary', email='[email protected]') 
    current_time = now() 
    myuser.birthday = current_time 
    myuser.save() 
    first_user = Myuser.objects.all()[0] 
    self.assertEqual(first_user.birthday, current_time, 'first_user.birthday should be equal to the current_time') 

Le problème est que mon test a échoué et je ne pouvais pas voir immédiatement pourquoi. L'échec d'assert a rapporté le message que j'avais fourni et j'étais confus parce que j'étais sûr que l'anniversaire a été mis à la valeur de maintenant. J'ai fini par devoir refactoriser mon affirmation pour rendre la valeur défaillante claire. Cela a révélé que l'anniversaire était un champ de date et non un champ date/heure. Ma question est la suivante: existe-t-il une autre forme d'affirmation qui permet de sauvegarder les valeurs attendues et réelles dans le cadre du message d'échec ou si je suis en quelque sorte en train d'utiliser ou de mal interpréter l'API?

+1

Incidemment, avez-vous jeté un oeil à UserProfiles? https://docs.djangoproject.com/fr/1.4/topics/auth/#storing-additional-information-about-users (apparemment, ils changent dans Django 1.5 tho) – hwjp

+0

Merci pour le conseil! Je n'avais pas encore lu tous les docs django. J'essaie d'arriver à la vitesse en utilisant un certain nombre de tutoriels et d'exemples que je trouve sur Internet et je lis "Le Guide définitif de Django 2ème édition" – Cliff

Répondre

4

Django n'implémente pas assertEqual, il utilise simplement le module unittest de Python pour celui-là.

Ce que vous avez besoin est de définir l'attribut longMessage-True pour votre classe de cas de test, comme ceci:

class VerboseTestCase(TestCase): 
    longMessage = True 

    def test_creating_a_user_with_attributes(self): 
     myuser = Myuser.objects.create_user('Gary', email='[email protected]') 
     current_time = now() 
     myuser.birthday = current_time 
     myuser.save() 
     first_user = Myuser.objects.all()[0] 
     self.assertEqual(first_user.birthday, current_time, 'first_user.birthday should be equal to the current_time') 

qui quelque chose de sortie comme celui-ci si le test échoue:

AssertionError: <datetime 1> != <datetime 2> : first_user.birthday should be equal to the current_time 

Cette est expliqué au Python's unittest docs.

+0

Awesome! C'est exactement ce que je cherchais, merci! – Cliff

2

Le message d'erreur par défaut indique les valeurs qui ont échoué. Mais vous avez surchargé cela en fournissant un troisième argument à assertEqual. Si vous l'omettez, les valeurs seront imprimées. Comme le montre Gonzalo, vous pouvez obtenir le meilleur des deux mondes en utilisant l'attribut longMessage.

+0

Merci! Oui, j'ai déterminé le remplacement peu après la publication et l'attribut longMessage rend les choses encore meilleures. – Cliff

Questions connexes