2013-09-24 17 views
32

urls.py numaralı telefonum haricinde uygulamamda% 100 test kapsamına ulaştım. URL'lerim için anlamlı birim testleri nasıl yazabileceğime dair herhangi bir tavsiyeniz var mı?Django URL'lerini nasıl test edebilirim?

FWIW Bu soru, Test-Driven Development ile deneme yaparken ve bunları düzeltmek için kod yazmadan önce başarısız testler yapmak istediğimde ortaya çıktı.

cevap

43

Tek yön reverse URL isimlere olmak ve 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/') 

Muhtemelen görüşlerini her durumda test ediyoruz yılında, Şimdi Örnek

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

geçerli kılacak.

Şimdi URL sağ görüşe bağlanmak test etmek, değişken resolver (ResolverMatch sınıf örneği) Şimdi resolve

from django.urls import resolve 

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

kullanabilirsiniz, aşağıdaki seçenekler sunulur

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

FYI meslektaşlarım bu kavramı almışlar ve [[assert]] 'i (https://github.com/incuna/incuna-test-utils/blob/master/incuna_test_utils/testcases/urls.py#L8) Yeni testlerimiz için yeni kütüphanemiz] (https://github.com/incuna/incuna-test-utils). – meshy

+2

Kullanıyorum: "assertEqual (resolver.func.func_name, 'archive')' çözümleyicinin doğru görünümde olduğunu test etmek için. Anladığım kadarıyla, "resolver.view_name" aslında görünüm değil, url kuralının adıdır. –

+0

Genel olarak Django testlerinde (örn., Görünümler için) veya yalnızca bu durumda özellikle birim test URL'leri için 'reverse (...) 'kullanarak mı destekliyorsunuz? Görme testinde çok kullandığını görüyorum ama bir anti-desen gibi görünüyor. –