4

我的 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'))

现在这不起作用,即使我在此方法中打印 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')

有人要求我包含我的 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

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

4

1 回答 1

4

可能最初的发帖人早就解决了他的问题并继续前进,但这里的解决方案是不要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')

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

于 2017-01-13T10:02:29.790 回答