(django) unittest für urls.py re patterns ?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jens hat geschrieben:btw. weiß jemand, wie man seine urls.py am besten per unitest überprüfen kann? Hat da jemand ein Beispiel?
Vorgeschlagen wird von den django Jungs ja, das man normale unittest schreibt und einen fake POST/GET absetzt und den response überprüft. Ich denke aber ein Test der direkter die REs überprüft wäre besser...

Ich hab mir jetzt was gebastelt:
http://pylucid.net:8080/pylucid/browser ... atterns.py

Einmal teste ich mit django.core.urlresolvers.reverse:

Code: Alles auswählen

        self.assertEqual(
            reverse('django.contrib.admin.views.main.index'),
            "/%s/" % settings.ADMIN_URL_PREFIX
        )
Ich schaue also nach, wie der Pfad zu einer angegebenem view ausschaut...

Und einmal mit django.core.urlresolvers.RegexURLResolver().resolve:

Code: Alles auswählen

urlconf = settings.ROOT_URLCONF
resolver=RegexURLResolver(r'^/', urlconf)
resolve = resolver.resolve

view_function, function_args, function_kwargs = self.resolve("/dir/url/")

self.assertEqual("module_name", view_function.__module__)
self.assertEqual("func_name", view_function.func_name)
In dem Falle schaue ich nach ob eine URL auch zum gewünschtem view aufgelöst wird...


Irgendwer eine bessere Idee???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sieht gut aus.

Du kannst - jedenfalls in meiner Trunk-Version, keine Ahnung ob das API ist - get_resolver() benutzen, das macht, was du per Hand machst.

Hier ein ungetestetes Beispiel:

Code: Alles auswählen

from django.core.urlresolvers import get_resolver

def assertURL(self, url, func, *args, **kwargs):
  f, a, kw = get_resolver().resolve(url)
  self.assertSame(f, func)
  self.assertEqual(a, args)
  self.assertEqual(kw, kwargs)

def test_foo(self):
  self.assertURL('/foo/45/', views.foo, '45')
Warum vergleichst du nicht direkt die Funktionsobjekte im zweiten Beispiel? Geht das nicht? Außerdem würde ich noch die Argumente vergleichen.

Ich nutze eigentlich inzwischen in der URLconf nur noch Funktionsobjekte, auch wenn die Fehlermeldung dann echt häßlich ist - irgendwie schafft das System dann leider nicht, die übliche Fehlerseite anzuzeigen. Dennoch fühlt sich das besser an, als Strings zu benutzen.

Stefan
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Die Argumente vergleiche ich mittlerweile, siehe: http://pylucid.net:8080/pylucid/browser ... atterns.py

get_resolver muß ich mir mal ansehen, danke für den Tipp.

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