2013-09-24 25 views
32

Osiągnąłem 100% pokrycia testowego w mojej aplikacji wszędzie oprócz mojego urls.py. Czy masz jakieś sugestie, jak mogę napisać znaczące testy jednostkowe dla moich adresów URL?W jaki sposób mogę testować adresy URL django?

FWIW To pytanie pojawiło się, ponieważ eksperymentuję z rozwojem testowym i chcę przeprowadzić testy, zanim napiszę kod, aby je naprawić.

Odpowiedz

43

Jednym ze sposobów byłoby reverse nazw URL i zatwierdź

Przykład

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

Teraz w teście

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/') 

Prawdopodobnie testowanie widoki jakikolwiek.

Teraz, aby sprawdzić, czy adres URL połączyć się z prawej widzenia, można użyć resolve

from django.urls import resolve 

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

Teraz w zmiennej resolver (ResolverMatch klasy instancji), masz następujące opcje

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

FYI moi koledzy przyjęli tę koncepcję i złożyli ["asert"] (https://github.com/incuna/incuna-test-utils/blob/master/incuna_test_utils/testcases/urls.py#L8) za to w [ nasza nowa testowa biblioteka testująca Units) (https://github.com/incuna/incuna-test-utils). – meshy

+2

Używam: 'assertEqual (resolver.func.func_name, 'archive')', aby przetestować, czy resolver wyląduje na poprawnym widoku. O ile rozumiem 'resolver.view_name' jest tak naprawdę nazwą reguły url, a nie widoku. –

+0

Czy zaleca się używanie 'reverse (...)' dla adresów URL w testach Django w ogóle (np. Dla widoków), czy tylko w tym przypadku w celu specyficznego testowania urządzeń? Widzę, że często używany w testach widokowych, ale wydaje się, że jest to anty-wzór. –