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