2013-09-24 7 views
32

urls.pyを除いて、私のアプリケーションではどこでもテストカバレッジを100%達成しました。 私のURLの意味ある単体テストの書き方についての推奨事項はありますか?ユニットテストのdjangoのURLはどのようにするのですか?

FWIWこの疑問は、テスト駆動開発を試していて、問題を解決するコードを書く前にテストが失敗した場合に発生しました。

答えて

43

一つの方法は、reverse URL名になり、テスト

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

あなたはおそらくビューをとにかくテストするには、今の例

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

検証します。

さて、URLが右側のビューに接続することをテストするために、あなたは変数resolverResolverMatchクラスのインスタンス)に今resolve

from django.urls import resolve 

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

を使用することができ、次のオプションを持っている

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

私の同僚はこのコンセプトを採用し、["assert"](https://github.com/incuna/incuna-test-utils/blob/master/incuna_test_utils/testcases/urls.py#L8)を[新しいユニットテストユーティリティライブラリ](https://github.com/incuna/incuna-test-utils)を参照してください。 – meshy

+2

私は 'assertEqual(resolver.func.func_name、 'archive')'を使って、リゾルバが正しいビューにあることをテストします。私が知っている限り、 'resolver.view_name'は実際にはビューではなくURLルールの名前です。 –

+0

一般的なDjangoテスト(ビュー)のURLには 'reverse(...) 'を使用するか、この場合は特に単体テストのURLを使用することをお勧めしますか?私はビューのテストでそれが多く使われているのを見ますが、アンチパターンのように感じます。 –