我在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'))
现在这个不起作用了,重定向得到404错误,即使当我在此方法中打印settings.DOWNLOAD_URL时它是正确的,并且复制/粘贴到浏览器中证明它可以工作。我开始研究为什么它不起作用,然后我注意到Django源代码中的这一点:
请注意,assertRedirects无法用于外部链接,因为它使用TestClient进行请求。
那么,如何测试这些重定向呢?我不需要任何超级花哨的东西,我希望检查响应的状态码和位置。我看到响应有一个follow参数,并尝试了类似于这样的东西,但仍然不起作用:
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')
有人请求我将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
任何有助于解决这个问题的帮助都将不胜感激。提前谢谢。