Seite 1 von 1

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

Verfasst: Mittwoch 19. Dezember 2007, 17:22
von jens
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???

Verfasst: Samstag 22. Dezember 2007, 13:52
von sma
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

Verfasst: Montag 24. Dezember 2007, 13:33
von jens
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.