2010-02-23 1 views
0

J'ai un test qui échoue avec:Comment puis-je explorer de manière interactive pourquoi un test échoue?

====================================================================== 
    FAIL: test_register_should_create_UserProfile (APP.forum.tests.test_views.UserTestCAse) 
    ---------------------------------------------------------------------- 
    Traceback (most recent call last): 
     File "/Users/Bryan/work/app/../app/forum/tests/test_views.py", line 25, in test_register_should_create_UserProfile 
     self.assertEqual(response.status_code, 200) 
    AssertionError: 404 != 200 

Voici le test:

class UserTestCAse(TestCase): 
    def test_register_should_create_UserProfile(self): 
    from django.test.client import Client 
    c = Client() 
    # I'm skipping account/signin/ because that requires me to visit Google. 
    response = c.post('account/signin/complete/', {'username': 'john', "email":'[email protected]', u'bnewaccount': 'Signup'}) 
    # request.POST from pdb() session with breakpoint in register() 
    # <QueryDict: {u'username': [u'john'], u'email': [u'[email protected]'], u'bnewaccount': [u'Signup']}> 

    #How do I inspect what is breaking in the test case? 
    #How do I run the test client in the shell? 
    self.assertEqual(response.status_code, 200) 

    user = User.objects.get(username ='john') 
    self.assertTrue(user.get_profile()) 

Y at-il de toute façon que je peux voir pourquoi cette réponse ne revient pas 200?

J'ai essayé d'utiliser le TestClient() dans la coquille, mais cela ne fonctionne pas:

In [1]: from django.test.client import Client 

In [2]: c = Client() 

In [3]: response = c.post('account/signin/complete/', {'username': 'john', "email":'[email protected]', u'bnewaccount': 'Signup'}) 
--------------------------------------------------------------------------- 

KeyError: 'tried' 

Répondre

2

Si vous obtenez un 404 inattendu, la page d'erreur Django vous montrerait l'erreur (en supposant que DEBUG est True). Dans ce cas, vous pourriez juste print response.content pour montrer cette traceback, et couper et coller cela dans un navigateur. De plus, n'oubliez pas que vous pouvez entrer dans un test en cours d'exécution avec le débogueur interactif, pdb, comme n'importe quelle autre forme de code exécutable, de sorte que vous pouvez inspecter la réponse de façon dynamique. Ou même, mettez le point d'arrêt avant le poste, de sorte que vous pouvez parcourir la vue.

Cependant, sur un second regard, je soupçonne que votre URL ne correspond pas, car il vous manque un \ initial.

+0

Bon oeil. Le '/' a corrigé le client de test. Je ne suis pas capable d'entrer dans 'pdb' lors de l'exécution des tests. Le shell n'affiche jamais d'invite de commande pdb. – BryanWheelock

3

Cela ne semble pas juste.

user = User.objects.get('username'=='john') 

Si vous voulez interroger, vous devez écrire des requêtes dans le style décrites dans ce guide

http://docs.djangoproject.com/en/1.1/topics/db/queries/#topics-db-queries

user = User.objects.get(username = 'john') 

par exemple.

Pour déboguer, vous pouvez exécuter des choses sur la ligne de commande. C'est ce que nous faisons. Le tutoriel Django montre tous les exemples comme s'ils étaient tapés interactivement sur la ligne de commande.

>>> from myapp.models import Client 
>>> Client.objects.get(name = 'value') 

etc.

Vous n'essayez généralement pas d'exécuter les tests unitaires de la ligne de commande. C'est difficile à faire à cause de toutes les choses que le cadre de test unitaire fait pour vous.

En règle générale, vous parcourez les instructions de la vue d'application une à la fois pour vous assurer que vos fonctions d'affichage fonctionnent réellement.

+0

La vue fonctionne bien, j'essaie de comprendre comment faire pour que le django.test.client.Client demande la page avant de commencer à changer le modèle de l'utilisateur. – BryanWheelock

+0

L'exécution interactive du client unittest n'est pas vraiment pratique. Que disent les logs de runserver à propos de l'erreur 404? –

Questions connexes