2017-10-05 19 views
0

j'utilisais le test suivant pour vérifier si la page décide de corriger modèle:tests unitaires dans Django avec des motifs url flexibles

from django.test import TestCase 
class HomePageTest(TestCase): 
    def test_landing_page_returns_correct_html(self): 
     response = self.client.get('/') 
     self.assertIn(member='Go to the', container=response.content.decode()) 

    def test_uses_test_home_template(self): 
     response = self.client.get('/test/') 
     self.assertTemplateUsed(response=response, 
           template_name='myapp/home.html') 

je de nombreuses variantes de self.client.get('/test/') ou self.client.get('/test/dashboard/') etc. dans de nombreux de nombreux tests. Tous sont dans mon myapp.urlpatterns. J'ai ensuite décidé de me débarrasser de /test/. Ou simplement changer le modèle d'URL. Tous les tests ont échoué parce que, bien, j'ai codé en dur les URL.

Je voudrais utiliser des URL flexibles dans mes tests. Je suppose que cela implique quelque chose comme:

from myapp.urls import urlpatterns as myapp_urls 

et en utilisant myapp_urls pendant les essais.

J'ai deux questions:

  1. Comment puis-je mettre en œuvre?
  2. Y aura-t-il des effets secondaires (négatifs) de cette approche que je ne prévois pas?

Répondre

2

Vous pouvez utiliser reverse(), par exemple si vous avez quelque chose comme ça dans votre urls.py:

from news import views 

urlpatterns = [ 
    url(r'^archive/$', views.archive, name='news-archive') 
] 

vous pouvez écrire votre test comme celui-ci:

from django.test import TestCase 
from django.urls import reverse 

class NewsArchivePageTest(TestCase): 
    def test_news_archive_page_does_something(self): 
     response = self.client.get(reverse('news-archive')) 
     # do some stuff with the response 

En savoir plus sur reverse() dans le documentation. En ce qui concerne les effets secondaires négatifs, je ne pense pas qu'il y en ait.

+0

Cela a fonctionné très bien. J'ai d'abord ajouté 'myapp.urls import urlpatterns as myapp_urls' au préambule. Ensuite, j'ai utilisé 'reverse ('myapp_urls: test_view_url')', où 'test_view_url' est le nom du modèle d'URL que j'ai utilisé dans' urlpatterns'. Merci! – HBat