Mój cel: Dostęp do adresu URL {X0}} za pomocą klienta testowego z publikowaniem username / password, aby zalogować użytkownika.

Używam wbudowanego contrib.auth.login w Django 2.1.4

Test.py:

from django.contrib.auth.models import User
from django.contrib import auth
from django.test import Client
from django.urls import reverse

def test_login_valid():
    U = {'username': 'bob','password': 'bobbobbob'}
    u = User.objects.create(**U)
    C = Client()
    r = C.post(reverse('login'), U)
    su = auth.get_user(r.wsgi_request)

    print(u)
    print(r)
    print(su)
    print(su.is_authenticated)
    print(r.wsgi_request.user)
    print(r.wsgi_request.user.is_authenticated)

Uruchomiony test:

pytest --capture=no a14n/tests.py::test_login_valid
(…)
bob
<TemplateResponse status_code=200, "text/html; charset=utf-8">
AnonymousUser
False
AnonymousUser
False
.

Rejestracja / Login.html:

<form action="{% url 'login' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

Urls.py:

from a14n import views as a14n_views

urlpatterns = [
    path('signup/', a14n_views.signup, name='signup'),
    path('', include('django.contrib.auth.urls')),
]

Z drugiej strony w powłoki Django działa idealnie:

>>> from django.contrib.auth.models import User
>>> from django.test import Client
>>> from django.contrib import auth
>>> from django.urls import reverse
>>> U = {'username': 'bob','password': 'bobbobbob'}
>>> C = Client()
>>> r = C.post(reverse('login'), U)
>>> u = User.objects.create(**U)
>>> su = auth.get_user(r.wsgi_request)
>>> print(u)
bob
>>> print(r)
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/profile/">
>>> print(su)
bob
>>> print(r.wsgi_request.user)
bob
>>> print(r.wsgi_request.user.is_authenticated)
True
>>> print(su.is_authenticated)
True

Dlaczego testy dają MA TemplateResponse obiekt i powłokę django HttpResponseRedirect w odpowiedzi?

Zresztą, przekierowane czy nie, dlaczego testy nie mogą zalogować użytkownika?

Dzięki.

0
freezed 9 grudzień 2018, 01:25

1 odpowiedź

Najlepsza odpowiedź

Znalazłem rozwiązanie!

W moim teście używam u = User.objects.create(**U), który tworzy user z wyraźnym hasłem, a mój widok nigdy nie może się uwierzytelnić, ponieważ login() oczekuje hasła Hashed.

W u = User.objects.create_user(**U) hasło dla użytkownika testowego jest haszowane i test działa.

Mam nadzieję, że pomoże komuś :-)

1
freezed 9 grudzień 2018, 18:54