Django:当目标 URL 也是重定向时测试重定向

标签 django unit-testing url-redirection

所以我正在编写一个分成几个部分的网站,这些部分本身又分为几个小节。在我的设置中,当用户单击某个部分的链接(例如“/home”)时,他们将被重定向到其子部分之一(例如“/home/cover”)。此外,当用户进入页面根目录时,他们会被重定向到其中一个部分(在我的例子中是“/home”)。通过这种设置,当有人进入根目录时会发生什么,他们首先被重定向到“/home”,然后从那里重定向到“/home/cover”。这些重定向是这样实现的:

主要 urls.py:

from django.conf.urls import patterns, include, url
from django.views.generic.base import RedirectView

urlpatterns = patterns('',
    url(r'^$', RedirectView.as_view(url='/home')),
    url(r'^home/', include('components.home.urls', namespace='components.home')),
    ...
)

组件/主页/urls.py:
from django.conf.urls import patterns, include, url
from django.views.generic.base import RedirectView

from components.home import views

urlpatterns = patterns('',
    url(r'^$', RedirectView.as_view(url='cover')),
    url(r'^cover$', views.cover, name='home_cover'),
    ...
)

在实践中,这似乎工作得很好:我可以浏览我的网站,所有重定向都可以做他们应该做的。但是,我无法弄清楚如何为它们实现我的单元测试,尤其是对于根重定向。

我最初设计的测试是这样的:
def test_root_url_redirects_to_home_url(self):
    response = self.client.get('/')
    self.assertRedirects(response, '/home', status_code=301)

但是,当我运行它时,我遇到了错误:
"AssertionError: 301 != 200 : Couldn't retrieve redirection page '/home':
response code was 301 (expected 200)."

现在,我可以轻松删除所有双重重定向,并使每个重定向的 URL 直接指向其目标,但当前的配置感觉更简洁、更易于维护,因此如果有某种方法可以正确测试它,那就太完美了。

总的来说,我对 Django 和 Web 开发很陌生,所以如果我在这里遗漏了一个明显的答案,我很抱歉。

最佳答案

TestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='')

Asserts that the response return a status_code redirect status, it redirected to expected_url (including any GET data), and the final page was received with target_status_code.

If your request used the follow argument, the expected_url and target_status_code will be the url and status code for the final point of the redirect chain.

Source: Django docs



双重重定向没有坏处(除了额外的 HTTP 请求)。记住这一点,Django 的断言还会测试重定向到的 URL,如果它是本地 URL。它期望的默认响应代码是 200,但由于您有双重重定向,即 301,这将失败。所以为了使测试用例成功,是断言重定向也重定向:
self.assertRedirects(response, '/home', status_code=301, target_status_code=301)

关于Django:当目标 URL 也是重定向时测试重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19318246/

相关文章:

django - 在 uwsgi 上使用 django-environ 重新加载 .env

c# - Moq - 异步方法的设置。错误

java - 我可以运行所有不属于任何组的 TestNG 测试吗(在 Maven 中)?

php - 停止 WordPress 从 301 重定向/index.php 到/

grails - Grails基于全局变量的重定向

python - Django 仅清除详细 View 的缓存

python - 从 Django 中的一组对象中获取平均值

Android : Getting a Bitmap from a url connection (graph. facebook.com)重定向到另一个网址

python - 了解 Django-LDAP 身份验证

javascript - 如何调用在不同文件中导入的对象内部的方法