69 votes

Comment simuler des utilisateurs et des requêtes dans Django ?

J'ai du code django qui interagit avec des objets de requête ou des objets utilisateur. 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 de django ou dans un unittest, que passeriez-vous là-dedans ? Ici, un simple objet User fera l'affaire, mais le besoin d'un objet de requête fantaisie est également fréquent.

Pour le shell ou pour unittests :

  • Comment se moquer des utilisateurs ?
  • Comment simuler les demandes ?

75voto

naoko Points 739

Pour la demande, j'utiliserais RequestFactory inclus dans 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.models.User comme @ozan l'a suggéré et peut-être avec garçon d'usine pour la vitesse (avec le garçon d'usine, vous pouvez choisir de ne pas sauvegarder dans la base de données)

50voto

ozan Points 3851

Comment se moque-t-on des utilisateurs ?

Initialiser un django.contrib.auth.models.User objet. User.objects.create_user rend la chose facile.

Comment simuler les demandes ?

Initialiser un django.http.HttpRequest objet.

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

7voto

Michael Williamson Points 6210

Vous pouvez soit créer vos propres mocks, comme l'a suggéré Anurag Uniyal, soit utiliser un framework de mocking.

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 dirais que cela va à l'encontre du but du test unitaire. Un test unitaire ne devrait pas toucher à la base de données, mais en créant un utilisateur, vous avez modifié la base de données, d'où l'intérêt d'en simuler un.

6voto

Anurag Uniyal Points 31931

Pour en savoir plus sur les objets fantaisie, cliquez ici
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

Et utilisez cette librairie python pour simuler un utilisateur.
http://python-mock.sourceforge.net/

Sinon, vous pouvez écrire vous-même une classe d'utilisateur simple, en utilisant ceci comme point de départ

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

    def __getattr__(Self, name):
        return self

ajouter des cas particuliers etc etc

5voto

Daniel Roseman Points 199743

Vous n'avez pas besoin de simuler 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 demandes, utilisez cet extrait de Simon Willison.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X