如何使用django-pytest关注Django重定向?

时间:2018-01-09 11:08:10

标签: django pytest pytest-django

在Django中设置 ArchiveIndexView 时,我可以通过自己导航到该页面,成功显示模型中的项目列表。

当打算在pytest中编写测试以验证导航到页面" checklist_GTD / archive /"成功后,测试失败并显示以下消息:

>       assert response.status_code == 200
E       assert 301 == 200
E        +  where 301 = <HttpResponsePermanentRedirect status_code=301, "text/html; charset=utf-8", url="/checklist_GTD/archive/">.status_code

test_archive.py:4: AssertionError

我知道有一种方法可以按照请求获取最终的status_code。有人可以帮助我在pytest-django中完成此操作,类似于this question吗? documentation on pytest-django在重定向上没有任何内容。感谢。

2 个答案:

答案 0 :(得分:5)

pytest-django提供未经身份验证的client和已登录的admin_client作为固定装置。真的简化了这种事情。假设您正在使用admin_client,因为您只想尽可能轻松地测试重定向,而无需手动登录:

def test_something(admin_client):
    response = admin_client.get(url, follow=True)
    assert response.status_code == 200

如果您想登录标准用户:

def test_something(client):
    # Create user here, then:
    client.login(username="foo", password="bar")
    response = client.get(url, follow=True)
    assert response.status_code == 200

在其中任何一个中使用follow=Trueresponse.status_code将等于重定向后页面的返回代码,而不是对原始URL的访问权限。因此,它应解决为200,而不是301。

我认为它没有在pytest-django中记录,因为该选项继承自它从(making requests)子类化的Django测试客户端。

答案 1 :(得分:-3)

更新: 我被遗忘了,但我仍然认为我的答案更好,所以让我解释一下。

我仍然认为Shacker的答案存在问题,您可以在其中设置follow = True并获得200的响应代码但不在您期望的URL处。例如,您可能会意外地重定向到登录页面,请关注并获得200的响应代码。

据我所知,我问了一个关于如何用pytest完成某些事情的问题,我之所以被投票,是因为我使用Django的内置TestCase类提供了答案。然而,对于我来说,测试的正确答案对我来说比仅使用pytest更重要。如下所述,我的答案仍适用于pytest的测试发现,所以我认为答案仍然有效。毕竟,pytest是基于Django的内置TestCase构建的。我的回答断言200响应代码来自我预期的来自。

最好的解决方案是修改pytest以包含expected_url作为参数。如果有人愿意这样做,我认为这将是一个很大的改进。谢谢你的阅读。

原始内容:

在这里回答我自己的问题。我决定使用内置的Django测试框架assertRedirects包含最终预期的URL,并验证它(1)最初使用302响应重定向,(2)最终成功使用代码{{1} 在预期的网址

200

向@tdsymonds提示,指出我正确的方向。我赞赏Shacker的回答,但在某些情况下,当页面被重定向到不受欢迎的URL时,重定向结果为from django.test import TestCase, Client def test_pytest_works(): assert 1==1 class Test(TestCase): def test_redirect(self): client = Client() response = client.get("/checklist_GTD/archive/") self.assertRedirects(response, "/expected_redirect/url", 302, 200) 。通过上述解决方案,我可以强制执行重定向网址which pytest-django does not currently support

请注意:此答案符合200的自动发现功能,因此不兼容(它会自动发现pytest-django和Django TestCase测试)。