使用灵活的 url 模式在 Django 中进行单元测试
Unit testing in Django with flexible url patterns
我正在使用以下测试来检查页面是否解析为正确的模板:
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')
我在许多测试中使用了 self.client.get('/test/')
或 self.client.get('/test/dashboard/')
等的许多变体。所有这些都在我的 myapp.urlpatterns
中。
然后有一天我决定摆脱/test/
。或者简单地更改 URL 模式。所有测试都失败了,因为我硬编码了 URLs。
我想在测试中使用灵活的 URL。我假设它涉及类似的东西:
from myapp.urls import urlpatterns as myapp_urls
并在整个测试过程中使用 myapp_urls
。
我有两个问题:
- 我该如何实施?
- 这种方法会不会有任何我没有预见到的(负面)副作用?
您可以使用 reverse()
,例如,如果您的 urls.py
:
中有这样的内容
from news import views
urlpatterns = [
url(r'^archive/$', views.archive, name='news-archive')
]
你可以这样写你的测试:
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
在 documentation 中阅读有关 reverse()
的更多信息。至于负面影响,我认为没有。
我正在使用以下测试来检查页面是否解析为正确的模板:
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')
我在许多测试中使用了 self.client.get('/test/')
或 self.client.get('/test/dashboard/')
等的许多变体。所有这些都在我的 myapp.urlpatterns
中。
然后有一天我决定摆脱/test/
。或者简单地更改 URL 模式。所有测试都失败了,因为我硬编码了 URLs。
我想在测试中使用灵活的 URL。我假设它涉及类似的东西:
from myapp.urls import urlpatterns as myapp_urls
并在整个测试过程中使用 myapp_urls
。
我有两个问题:
- 我该如何实施?
- 这种方法会不会有任何我没有预见到的(负面)副作用?
您可以使用 reverse()
,例如,如果您的 urls.py
:
from news import views
urlpatterns = [
url(r'^archive/$', views.archive, name='news-archive')
]
你可以这样写你的测试:
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
在 documentation 中阅读有关 reverse()
的更多信息。至于负面影响,我认为没有。