7 Stimmen

Mit dem Sitzungsobjekt in Django-Unit-Test arbeiten

Ich schreibe eine Login-Ansicht und möchte einen Unittest für die Ansicht hinzufügen. Meine Ansicht sieht so aus:

def login(request):

    if request.POST:
            usrname = request.POST.get('username')
            password = request.POST.get('password')
            user = authenticate(username=usrname, password=password)

            if user is not None:
                    auth_login(request, user)
                    return redirect('/core/home/')
            else:
                    context = {'error_message': "Ungültiger Benutzername oder Passwort"}
                    return render(request, 'core/login.html', context)
    else:
            c = {}
            c.update(csrf(request))
            return render_to_response('core/login.html',c)

def home(request):
    if request.user.is_authenticated():
        context = {'user' : request.user}
        return render(request, 'core/home.html', context)
    else:
        return render(request, 'core/login.html')

Und mein Unittest sieht so aus:

class CoreViewTests(TestCase):
    def setUp(self):
            self.factory = RequestFactory()

    def test_login_view_with_valid_user(self):
            uf = UserFactory()
            user = uf.make_user("GültigerBenutzer1", "12345", "benutzer@abc.com")
            self.assertEqual(user.username, "ValidUser1")
            request = self.factory.post('/core/login', {"username": "GültigerBenutzer1", "password": "12345"})
            response = login(request)
            self.assertEqual(response.status_code, 200)

Der Unittest stürzt ab, weil er das Session-Objekt nicht finden kann. Ich habe ein paar Anleitungen auf den Websites befolgt, indem ich ein Dummy-Session-Dictionary definiert habe, aber das hat nicht geholfen.

Kann mir jemand erklären, wie man einen Unittest für eine Ansicht schreibt, die mit dem Session-Objekt umgehen muss?

Danke.

9voto

Duncan Parkes Punkte 1862

Aus der Dokumentation für das RequestFactory-Objekt:

Es unterstützt keine Middleware. Sitzungs- und Authentifizierungsattribute müssen vom Test selbst bereitgestellt werden, wenn sie für die ordnungsgemäße Funktion der Ansicht benötigt werden.

Sie könnten versuchen, request.session manuell auf ein Dictionary mit entsprechenden Inhalten zu setzen, wie Sie sagen. Es könnte sich jedoch als einfacher erweisen, den altmodischen Django-Testclient zu verwenden.

1voto

Alex Fang Punkte 59

So etwas wie das: request.session = {'num_visits': 0}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X