5

在 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 中完成这项工作,类似于这个问题吗?pytest-django 上的文档没有关于重定向的任何内容。谢谢。

4

2 回答 2

9

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=True在其中任何一个中使用,response.status_code将等于重定向后页面的返回代码,而不是对原始 URL 的访问。因此,它应该解析为 200,而不是 301。

我认为它没有在 pytest-django 中记录,因为该选项是从它子类的 Django 测试客户端继承的(发出请求)。

于 2018-03-21T06:06:05.310 回答
0

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

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

我知道我问了一个关于如何使用 pytest 完成某事的问题,而我之所以被否决是因为我使用 Django 的内置 TestCase 类提供了答案。但是,测试的正确答案在当时对我来说比只使用 pytest 更重要。如下所述,我的答案仍然适用于 pytest 的测试发现,所以我认为答案仍然有效。毕竟,pytest 是建立在 Django 内置的 TestCase 之上的。我的回答断言 200 的响应代码来自我期望它来自的地方。

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

原创内容:

在这里回答我自己的问题。我决定使用内置的 Django 测试框架包含最终预期的 URL,assertRedirects并验证它 (1) 最初通过302响应重定向,并且 (2) 最终通过200 预期 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)

向@tdsymonds 致敬,为我指明了正确的方向。我很欣赏 Shacker 的回答,但我在某些情况下看到重定向结果是200当页面被重定向到不受欢迎的 URL 时。使用上面的解决方案,我可以强制执行pytest-django 当前不支持的重定向 URL 。

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

于 2018-03-18T23:27:56.313 回答