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?
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)
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.
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.
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
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.