Comment se moquer des utilisateurs et des requêtes dans django

J'ai du code django qui interagit avec les objets request ou les objets user. Par exemple quelque chose comme:

foo_model_instance = models.get_or_create_foo_from_user(request.user)

Si vous deviez tester avec le shell Python django ou dans un unittest, que passeriez-vous là-dedans? Ici, un objet utilisateur fera l'affaire, mais le besoin d'un objet de requête fictif apparaît également fréquemment.

Pour le shell ou pour unittests:

  • Comment vous moquez-vous des utilisateurs?
  • Comment vous moquez-vous des demandes?
57
demandé sur Purrell 2010-01-10 08:20:46

5 réponses

Pour request, j'utiliserais RequestFactory inclus avec Django.

from django.test.client import RequestFactory
rf = RequestFactory()
get_request = rf.get('/hello/')
post_request = rf.post('/submit/', {'foo': 'bar'})

Pour les utilisateurs, j'utiliserais django.contrib.auth.modèle.Utilisateur comme @ ozan suggéré et peut-être avec factory boy pour la vitesse (avec factory boy vous pouvez choisir de ne pas enregistrer dans DB)

55
répondu naoko 2016-03-29 14:39:28

Comment vous moquez-vous des utilisateurs?

Initialise un objet django.contrib.auth.models.User. User.objects.create_user ça facilite les choses.

Comment vous moquez-vous des demandes?

L'Initialisation d'un django.http.HttpRequest objet.

Bien sûr, il y a des raccourcis en fonction de ce que vous voulez faire. Si vous avez juste besoin d'un objet avec un attribut user qui pointe vers un utilisateur, créez simplement quelque chose (n'importe quoi) et donnez-lui cet attribut.

43
répondu ozan 2010-01-10 09:59:04

Vous pouvez soit lancer vos propres mocks, comme Anurag Uniyal l'a suggéré, soit utiliser un framework moqueur.

En réponse à ceux qui disent que vous pouvez simplement créer un utilisateur ordinaire comme vous le feriez de toute façon dans Django... Je suggère que cela défait le point du test unitaire. Un test unitaire ne devrait pas toucher la base de données, mais en créant un utilisateur, vous avez changé la base de données, d'où pourquoi nous voudrions en moquer un.

6
répondu Michael Williamson 2010-01-10 11:43:56

Lire sur les objets fantaisie here
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

Et utiliser cette lib python pour se moquer d'un utilisateur
http://python-mock.sourceforge.net/

Sinon, vous pouvez écrire vous-même une classe utilisateur simple, utilisez-la comme point de départ

class MockUser(object):
    def __call__(self, *args, **kwargs):
        return self

    def __getattr__(Self, name):
        return self

Ajouter des cas spécifiques etc etc

6
répondu Anurag Uniyal 2011-02-23 13:42:04

Vous n'avez pas besoin de vous moquer des utilisateurs, car vous pouvez simplement en créer un dans votre test - la base de données est détruite une fois le test terminé.

Pour simuler des requêtes, utilisez cet extrait de Simon Willison.

4
répondu Daniel Roseman 2010-01-10 10:18:27