Self.client.login (…) de Django ne fonctionne pas dans les tests unitaires

J’ai créé des utilisateurs pour mes tests unitaires de deux façons:

1) Créez un appareil pour “auth.user” qui ressemble en gros à ceci:

{ "pk": 1, "model": "auth.user", "fields": { "username": "homer", "is_active": 1, "password": "sha1$72cd3$4935449e2cd7efb8b3723fb9958fe3bb100a30f2", ... } } 

J’ai omis les parties apparemment sans importance.

2) Utilisez ‘create_user’ dans la fonction setUp (bien que je préfère tout garder dans ma classe de fixtures):

 def setUp(self): User.objects.create_user('homer', '[email protected]', 'simpson') 

Notez que le mot de passe est simpson dans les deux cas.

J’ai vérifié que ces informations étaient correctement chargées dans la firebase database de test à maintes resockets. Je peux saisir l’object User en utilisant User.objects.get. Je peux vérifier que le mot de passe est correct en utilisant “check_password”. L’utilisateur est actif.

Pourtant, invariablement, self.client.login (username = ‘homer’, password = ‘simpson’) FAILS. Je suis perplexe quant à pourquoi. Je pense avoir lu chaque discussion sur Internet à ce sujet. Quelqu’un peut-il aider?

Le code de connexion de mon test unitaire ressemble à ceci:

  login = self.client.login(username='homer', password='simpson') self.assertTrue(login) 

Merci.

Le code qui ne fonctionne pas:

 from django.consortingb.auth.models import User from django.test import Client user = User.objects.create(username='testuser', password='12345') c = Client() logged_in = c.login(username='testuser', password='12345') 

Pourquoi ça ne marche pas?

Dans l’extrait de code ci-dessus, lorsque l’ User est créé, le hachage de mot de passe réel est défini sur 12345 . Lorsque le client appelle la méthode de login , la valeur de l’argument de password , 12345 , est transmise via la fonction de hachage, ce qui se traduit par quelque chose comme:

 hash('12345') = 'adkfh5lkad438....' 

Ceci est ensuite comparé au hachage stocké dans la firebase database, et le client se voit refuser l’access car 'adkfh5lkad438....' != '12345'

La solution

La chose à faire est d’appeler la fonction set_password , qui transmet la chaîne donnée à travers la fonction de hachage et stocke le résultat dans User.password .

En outre, après avoir appelé set_password nous devons enregistrer l’object User mis à jour dans la firebase database:

 user = User.objects.create(username='testuser') user.set_password('12345') user.save() c = Client() logged_in = c.login(username='testuser', password='12345') 

Un moyen plus simple consiste à utiliser force_login , nouveau dans Django 1.9.

 force_login(user, backend=None) 

Par exemple:

 class LoginView(TestCase): def setUp(self): self.client.force_login(User.objects.get_or_create(username='testuser')[0]) 

Vérifiez que django.consortingb.sessions est ajouté à INSTALLED_APPS car client.login() vérifie qu’il est et renverra toujours false s’il ne l’est pas:

https://docs.djangoproject.com/es/1.9/topics/http/sessions/#enabling-sessions

Pouvez-vous vérifier comme ci-dessous,

 from django.test import TransactionTestCase, Client class UserHistoryTest(TransactionTestCase): self.user = User.objects.create(username='admin', password='pass@123', email='[email protected]') self.client = Client() # May be you have missed this line def test_history(self): self.client.login(username=self.user.username, password='pass@123') # get_history function having login_required decorator response = self.client.post(reverse('get_history'), {'user_id': self.user.id}) self.assertEqual(response.status_code, 200) 

Ce cas de test a fonctionné pour moi.

Si quelqu’un continue à suivre cela, je pense que les atsortingbuts ‘is_staff’ et ‘is_active’ doivent être conservés True pour pouvoir se connecter avec succès ……

self.user = User.objects.create(username='testuser',password='pwd',is_active=1,is_staff=1)