2013-09-24 96 views
32

Tôi đã đạt được phạm vi kiểm tra 100% trong đơn đăng ký của mình ở mọi nơi ngoại trừ urls.py. Bạn có bất kỳ đề xuất nào về cách tôi có thể viết có ý nghĩa kiểm tra đơn vị cho URL của tôi không?Tôi làm cách nào để kiểm tra các url django?

FWIW Câu hỏi này phát sinh khi tôi đang thử nghiệm với Phát triển theo hướng thử nghiệm và muốn thử nghiệm không thành công trước khi tôi viết mã để khắc phục chúng.

Trả lời

43

Một cách sẽ được reverse tên URL và xác nhận

Ví dụ

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

Bây giờ, trong các thử nghiệm

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

Bạn đang có lẽ là thử nghiệm quan điểm anyways.

Bây giờ, để kiểm tra rằng URL kết nối với quan điểm đúng, bạn có thể sử dụng resolve

from django.urls import resolve 

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

Bây giờ trong biến (ví dụ lớp ResolverMatch) resolver, bạn có các tùy chọn sau

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

FYI đồng nghiệp của tôi đã thực hiện khái niệm này và thực hiện ["khẳng định"] (https://github.com/incuna/incuna-test-utils/blob/master/incuna_test_utils/testcases/urls.py#L8) cho nó trong [ thư viện utils thử nghiệm chưa hoàn thành mới của chúng tôi] (https://github.com/incuna/incuna-test-utils). – meshy

+2

Tôi đang sử dụng: 'assertEqual (resolver.func.func_name, 'archive')' để kiểm tra xem trình phân giải có được xem đúng hay không. Theo tôi hiểu 'resolver.view_name' thực sự là tên của quy tắc url, không phải là chế độ xem. –

+0

Bạn có ủng hộ bằng cách sử dụng 'reverse (...)' cho các url trong các bài kiểm tra Django nói chung (tức là, đối với các khung nhìn), hoặc chỉ trong trường hợp này là các url kiểm tra đơn vị cụ thể? Tôi thấy nó được sử dụng rất nhiều trong kiểm tra xem, nhưng nó cảm thấy giống như một anti-pattern. –