web-dev-qa-db-fra.com

Comment se moquer des utilisateurs et des demandes dans django

J'ai un code Django qui interagit avec les objets de requête ou les 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 Django python Shell ou dans un unittest, que feriez-vous ici? Ici, simplement un objet User fera l'affaire, mais le besoin d'un objet de requête factice revient également fréquemment.

Pour le Shell ou pour les unités:

  • Comment vous moquez-vous des utilisateurs?
  • Comment vous moquez-vous des demandes?
65
Purrell

Pour la demande, 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.models.User comme l'a suggéré @ozan et peut-être avec Factory Boy pour la vitesse (avec Factory Boy, vous pouvez choisir de ne pas enregistrer dans la base de données)

67
naoko

Comment vous moquez-vous des utilisateurs?

Initialisez un Django.contrib.auth.models.User objet. User.objects.create_user rend cela facile.

Comment vous moquez-vous des demandes?

Initialisez 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 attribut user qui pointe vers un utilisateur, créez simplement quelque chose (n'importe quoi) et donnez-lui cet attribut.

47
ozan

Vous pouvez soit rouler vos propres moqueries, comme l'a suggéré Anurag Uniyal, soit utiliser un framework de moquerie.

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 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ù la raison pour laquelle nous voudrions en simuler un.

7
Michael Williamson

En savoir plus sur les faux objets ici
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

Et utilisez cette bibliothèque 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
Anurag Uniyal

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 se moquer des demandes, utilisez cet extrait de Simon Willison.

5
Daniel Roseman