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

5

我在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

任何有助于解决这个问题的帮助都将不胜感激。提前谢谢。

请还要发布(或链接到)您应用程序的urlpatterns(在url.py中)和您的views.py中应该返回302(重定向)的方法或函数。 - miraculixx
好的,但如果你在那些方法中寻找错误,那是极不可能的,它们非常简单。 - macguru2000
我不太明白,如果它重定向,那么它就重定向了 - 每次都测试它是没有必要的,对吧?在将客户端转发到该URL之前,您始终可以在if块中检查是否收到200响应(或每隔一段时间)。 - user3467349
@user3467349,这是用于每次构建项目时运行的自动化测试套件。如果这些重定向开始失败,那么我的用户将无法下载我的产品,这将是一个巨大的问题。因此,我希望在提交新代码并重新构建项目时自动测试前进。 - macguru2000
此外,前向传递是通过一些自定义逻辑来确定的,因此我并不是在测试Django的转发能力,而是在测试我的代码对正确转发位置的确定。 - macguru2000
1个回答

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

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

谢谢你的帮助,这很有道理。不确定我怎么会错过那个,哈! - macguru2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接