Ich habe Benutzer für meine Komponententests auf zwei Arten erstellt:
1) Erstellen Sie ein Fixture für "auth.user", das ungefähr so aussieht:
{
"pk": 1,
"model": "auth.user",
"fields": {
"username": "homer",
"is_active": 1,
"password":
"sha1$72cd3$4935449e2cd7efb8b3723fb9958fe3bb100a30f2",
...
}
}
Ich habe die scheinbar unwichtigen Teile weggelassen.
2) Verwenden Sie 'create_user' in der setUp-Funktion (obwohl ich lieber alles in meiner Fixtures-Klasse behalten möchte):
def setUp(self):
User.objects.create_user('homer', '[email protected]', 'simpson')
Beachten Sie, dass das Passwort in beiden Fällen simpson ist.
Ich habe überprüft, ob diese Informationen immer wieder korrekt in die Testdatenbank geladen werden. Ich kann das User-Objekt mit User.objects.get abrufen. Ich kann mit 'check_password' überprüfen, ob das Passwort korrekt ist. Der Benutzer ist aktiv.
Self.client.login (Benutzername = 'Homer', Passwort = 'Simpson') schlägt jedoch immer fehl. Ich bin verblüfft, warum. Ich glaube, ich habe jede einzelne diesbezügliche Internetdiskussion gelesen. Kann jemand helfen?
Der Login-Code in meinem Unit-Test sieht folgendermaßen aus:
login = self.client.login(username='homer', password='simpson')
self.assertTrue(login)
Vielen Dank.
quelle
Antworten:
Der Code, der nicht funktioniert:
from django.contrib.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')
Warum funktioniert es nicht?
Im obigen Snippet wird beim
User
Erstellen von der tatsächliche Kennwort-Hash auf gesetzt12345
. Wenn der Client dielogin
Methode aufruft , wird der Wert despassword
Arguments12345
durch die Hash-Funktion übergeben, was zu so etwas wie führthash('12345') = 'adkfh5lkad438....'
Dies wird dann mit dem in der Datenbank gespeicherten Hash verglichen, und dem Client wird der Zugriff verweigert, weil
'adkfh5lkad438....' != '12345'
Die Lösung
Am besten rufen Sie die
set_password
Funktion auf, die den angegebenen String durch die Hash-Funktion leitet und das Ergebnis in speichertUser.password
.Außerdem
set_password
müssen wir nach dem Aufruf das aktualisierteUser
Objekt in der Datenbank speichern:user = User.objects.create(username='testuser') user.set_password('12345') user.save() c = Client() logged_in = c.login(username='testuser', password='12345')
quelle
User.objects.create_superuser()
undUser.objects.create_user()
die genau diesenset_password()
Anruf ausführen .User.objects.get_or_create()
den erforderlichenset_password()
Aufruf ausführtEine einfachere Möglichkeit ist die Verwendung
force_login
, neu in Django 1.9.force_login(user, backend=None)
Zum Beispiel:
class LoginView(TestCase): def setUp(self): self.client.force_login(User.objects.get_or_create(username='testuser')[0])
quelle
Können Sie wie unten überprüfen,
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)
Dieser Testfall hat bei mir funktioniert.
quelle
Überprüfen Sie, ob dies
django.contrib.sessions
hinzugefügt wurde,INSTALLED_APPS
daclient.login()
überprüft wird, ob dies der Fall ist und immer false zurückgibt, wenn dies nicht der Fall ist:https://docs.djangoproject.com/es/1.9/topics/http/sessions/#enabling-sessions
quelle
django.contrib.sessions.middleware.SessionMiddleware
in Middleware-Klassen können Sie sich nicht über django.test.Client anmelden. Ich brauche eine Woche, um diese Antwort zu findenfrom django.test import TestCase from django.contrib.auth.models import User from django.test import Client class MyProfile(TestCase): @classmethod def setUpClass(self): self.username = 'dummy' + data + '@gmail.com' self.password = 'Dummy@123' user = User.objects.create(username=self.username) user.set_password(self.password) user.save() c = Client() self.client_object = c.login(username=self.username, password=self.password) self.content_type = "application/json" response = self.client_object.post('/api/my-profile/', content_type=self.content_type)
quelle
Wenn jemand dies noch verfolgt, sollten die Attribute 'is_staff' und 'is_active' für eine erfolgreiche Anmeldung auf True gesetzt bleiben.
self.user = User.objects.create(username='testuser',password='pwd',is_active=1,is_staff=1)
quelle
is_staff
was definiert, ob der Zugriff auf das Admin-Panel im Allgemeinen gewährt wird. Wie Sie sehen können, haben die Daten in der Erstbuchung bereitsis_active = 1
und das ist auch die Standardeinstellung fürUser.objects.create()
.