Django,测试重定向到外部页面

mac*_*000 5 python django django-testing django-tests

我的 Django 应用程序中有一个路由规则,用于重定向到外部 CDN 的下载。我现在正在为我的应用程序编写测试,我想测试该路由是否成功重定向到我的 Django 设置中配置的 url。这是一个简化的示例,应该有助于解释我想要做的事情:

from django.test import SimpleTestCase
from django.test.client import Client
from django.conf import settings

class MyTestCase(SimpleTestCase):
    def setUp(self):
        self.client = Client()
    def test_download(self):
        response = self.client.get('/download/mac/')
        self.assertRedirects(response, settings.URLS.get('mac'))
Run Code Online (Sandbox Code Playgroud)

现在这不起作用,即使当我在此方法中打印 settings.DOWNLOAD_URL 时,重定向也会收到 404 错误,并且复制/粘贴到浏览器中证明它有效。我开始研究为什么它不起作用,我在 Django 源代码中注意到了这一点:

请注意,assertRedirects 不适用于外部链接,因为它使用 TestClient 来执行请求。

那么,如何测试这些重定向呢?我并不是在寻找任何超级花哨的东西,我期望检查的是响应的 status_code 和位置。我看到响应有一个跟随参数,并尝试了类似的操作,但它仍然不起作用:

    def test_download(self):
        response = self.client.get('/download/mac/', follow=True)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], settings.URLS.get('mac')
Run Code Online (Sandbox Code Playgroud)

有人要求我包含 urls.py 和views.py 中的相关部分,它们是:

# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns('myapp.views',
    url(r'^download/(?P<platform>\w+)/$', 'download_app', name='download'),
)

#views.py
from django.conf import settings
from django.shortcuts import redirect
from django.http import Http404

def download_app(request, platform):
    if platform in settings.URLS:
        return redirect( settings.URLS.get(platform) )
    else:
        raise Http404
Run Code Online (Sandbox Code Playgroud)

任何解决此问题的帮助将不胜感激。提前致谢。

Tor*_*sen 5

也许最初的发帖者已经解决了他的问题并在很久以前就继续前进,但这里的解决方案是不要follow=True他在替代提案中所做的那样指定,但该提案也不起作用。

下面将简单地检查正在测试的视图是否按预期重定向,而不依赖于外部资源。

def test_download(self):
    response = self.client.get('/download/mac')

    self.assertEqual(response.status_code, 302)
    self.assertEqual(response['Location'], 'http://external/resource')
Run Code Online (Sandbox Code Playgroud)

在 Django 1.7 中,assertRedirect有一个新参数fetch_redirect_response,可以将其设置为 False 以获得相同的效果,但我自己还没有尝试过。