[Django] LiveServerTestCase <-> response = self.client.post(

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

In Django kann man ja einmal mit dem Test-Client arbeiten:

Code: Alles auswählen

        response = self.client.post(self.secure_login_url,
            follow=True, # Redirect after successfully login
            data = {
                "username": self.username,
                "password": self.secure_password,
            }
        )
Hier stecken jede Menge Informationen am response Objekt.
u.a. Der Template context und damit auch die verwendete Form...

Wenn ich aber LiveServerTestCase nutzte, also Live mit Selenium arbeite, hab ich diese Informationen anscheinen nicht?!?

Nach https://docs.djangoproject.com/en/1.7/t ... ertestcase zu Urteilen kann ich nur den fertigen HTML Code haben.
Somit kann ich z.B. SimpleTestCase.assertFormError nicht nutzten, oder?

Hab ich was übersehen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Woher soll ein Browser wissen was im Template Context ist geschweige den was ein Template Context überhaupt ist? LiveServerTestCase macht wirklich nur dann Sinn wenn du wirklich Verhalten in einem echten Browser und/oder Javascript Teile der Webanwendung testen willst.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, der Browser kann das nicht wissen ;)

Aber der Server wird ja auch selbst gestartet. Zwar im eigenen Thread, aber an die Daten könnte man IMHO schon kommen...

Aber egal, denn assertFormError war ein schlechtes Beispiel. Wichtiger ist mit, das ich auf SimpleTestCase.assertContains zugreifen kann.
Dazu hab ich aber gerade eine Lösung gemacht:

Code: Alles auswählen

        response = FakedHttpResponse(content=self.driver.page_source)
        self.client = self.client_class() # Fresh Client() instance
        response.client = self.client

        # Add 'response.client.cookies':
        # driver.get_cookies() is a simple list of dict items, e.g.:
        # [{'name': 'csrftoken', 'value': 'yXoN3...', ...},...]
        for cookie in self.driver.get_cookies():
            response.set_cookie(
                key=cookie["name"],
                value=cookie["value"],

                max_age=cookie["expiry"],

                path=cookie["path"],
                domain=cookie["domain"],
                secure=cookie["secure"],
            )

        # response.cookies and response.client.cookies
        # are django.http.cookies.SimpleCookie instances
        response.client.cookies.update(response.cookies)

        # Add 'response.session':
        response.session = self.client.session

        return response
Damit hat man zugriff auf:
  • * response.content
    * response.cookies
    * response.client.cookies
    * response.session

So kann ich einigen Test Code einmal mit dem Django Test Client verwenden und gleichzeitig mit Selenium...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten