【问题标题】:Unit testing in Django with flexible url patterns使用灵活的 url 模式在 Django 中进行单元测试
【发布时间】:2018-03-17 12:30:40
【问题描述】:

我正在使用以下测试来检查页面是否解析为正确的模板:

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 模式。所有的测试都失败了,因为我硬编码了 URL。

我想在我的测试中使用灵活的 URL。我认为它涉及以下内容:

from myapp.urls import urlpatterns as myapp_urls

并在整个测试过程中使用myapp_urls

我有两个问题:

  1. 如何实现它?
  2. 这种方法是否会产生我无法预见的任何(负面)副作用?

【问题讨论】:

    标签: django unit-testing django-urls dry django-tests


    【解决方案1】:

    您可以使用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 myapp.urls import urlpatterns as myapp_urls。然后我使用了reverse('myapp_urls:test_view_url'),其中test_view_url 是我在urlpatterns 中使用的url 模式的名称。谢谢!
    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多