2013-09-24 12 views
32

Ho raggiunto il 100% di copertura di test nella mia applicazione ovunque tranne il mio urls.py. Avete qualche suggerimento su come scrivere significativi test unitari per i miei URL?Come posso testare unitamente gli URL django?

FWIW Questa domanda è sorta mentre sto sperimentando con Test-Driven Development e voglio test falliti prima di scrivere codice per risolverli.

risposta

43

Un modo potrebbe essere quello di reverse nomi URL e convalidare

Esempio

urlpatterns = [ 
    url(r'^archive/(\d{4})/$', archive, name="archive"), 
    url(r'^archive-summary/(\d{4})/$', archive, name="archive-summary"), 
] 

Ora, nel test

from django.urls import reverse 

url = reverse('archive', args=[1988]) 
assertEqual(url, '/archive/1988/') 

url = reverse('archive-summary', args=[1988]) 
assertEqual(url, '/archive-summary/1988/') 

Probabilmente si sta verificando i punti di vista in ogni modo.

Ora, per verificare che l'URL collegano alla vista a destra, è possibile utilizzare resolve

from django.urls import resolve 

resolver = resolve('/summary/') 
assertEqual(resolver.view_name, 'summary') 

Ora, nel resolver (ResolverMatch un'istanza di classe) variabile, sono disponibili le seguenti opzioni

'app_name', 
'app_names', 
'args', 
'func', 
'kwargs', 
'namespace', 
'namespaces', 
'url_name', 
'view_name' 
+2

Cordiali saluti, i miei colleghi hanno preso questo concetto e fatto un ["assert"] (https://github.com/incuna/incuna-test-utils/blob/master/incuna_test_utils/testcases/urls.py#L8) per questo in [ la nostra nuova libreria di test per l'unittest] (https://github.com/incuna/incuna-test-utils). – meshy

+2

Sto usando: 'assertEqual (resolver.func.func_name, 'archive')' per verificare che il resolver atterra sulla vista corretta. Per quanto ne so, 'resolver.view_name' è in realtà il nome della regola url, non la vista. –

+0

Ti difendi usando 'reverse (...)' per gli url nei test di Django in generale (cioè per le viste), o solo in questo caso per gli url di test dell'unità specifica? Vedo che è stato utilizzato molto in fase di test, ma sembra un anti-pattern. –