使用灵活的 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

我有两个问题:

  1. 我该如何实施?
  2. 这种方法会不会有任何我没有预见到的(负面)副作用?

您可以使用 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() 的更多信息。至于负面影响,我认为没有。