Seite 1 von 1

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

Verfasst: Samstag 30. Mai 2015, 08:24
von jens
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?

Re: [Django] LiveServerTestCase <-> response = self.client.p

Verfasst: Samstag 30. Mai 2015, 15:07
von DasIch
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.

Re: [Django] LiveServerTestCase <-> response = self.client.p

Verfasst: Samstag 30. Mai 2015, 22:29
von jens
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...