django - 使用灵活的 url 模式在 Django 中进行单元测试

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

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

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. 这种方法会不会有任何我没有预见到的(负面)副作用?

最佳答案

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

关于django - 使用灵活的 url 模式在 Django 中进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46593222/

相关文章:

python - 如何覆盖 django rest 框架 ModelViewSet 中的更新操作?

python - 这不是一个元组吗?

c# - 与 ShouldBeEquivalentTo 相反

unit-testing - Kotlin & MockK - 如果从另一个方法调用模拟方法,则模拟不起作用

python - Django 是否以某种方式缓存 url 正则表达式模式?

Django 1.11.7 - Django 压缩器 - 参数 5 : <class 'TypeError' >: expected LP_OVERLAPPED instance instead of pointer to OVERLAPPED

python - 如何忽略Rollbar中的404异常?

android - Android 中的单元测试?

django - 如何在模板中将 anchor 添加到 django url

django - 找不到页面 - 如何查找 Django URL 中的当前路径是否有效?