在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在重定向上没有任何内容。感谢。
答案 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=True
,response.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测试)。