如何用pytest-django跟随Django重定向完成ArchiveIndexView测试?
解决pytest-django中跟随Django重定向的问题
这个问题其实很常见,本质上是利用Django测试客户端的内置能力来处理重定向——pytest-django只是封装了Django的测试工具,所以直接用Django客户端的参数就行,文档没提是因为这属于Django本身的测试功能~
1. 基础解决方法:在请求中添加follow=True
你的测试失败是因为请求触发了301永久重定向,而默认情况下client.get()不会自动跟随重定向,返回的是重定向响应而非最终的页面响应。只需要在调用get方法时加上follow=True参数,客户端就会自动跟随所有重定向,返回最终到达页面的响应:
def test_archive_view(client): # 添加follow=True,自动跟随重定向 response = client.get('/checklist_GTD/archive/', follow=True) # 现在断言最终页面的状态码为200 assert response.status_code == 200
2. 验证重定向过程(可选)
如果你需要确认重定向的具体路径和状态码,可以通过response.redirect_chain属性查看所有重定向步骤。这个属性是一个列表,每个元素是一个元组(重定向目标URL, 状态码):
def test_archive_redirect(client): response = client.get('/checklist_GTD/archive', follow=True) # 故意不带斜杠触发重定向 # 验证重定向链是否符合预期 assert response.redirect_chain == [('/checklist_GTD/archive/', 301)] # 同时验证最终页面状态码 assert response.status_code == 200
3. 为什么会出现这个301?
顺便提一句,你遇到的301大概率是Django的APPEND_SLASH设置(默认开启)导致的:如果你的URLconf中配置的路径是带末尾斜杠的checklist_GTD/archive/,但请求时没加斜杠,Django会自动重定向到带斜杠的版本并返回301。用follow=True可以忽略这个细节,直接拿到最终页面的响应。
内容的提问来源于stack exchange,提问作者Scott Skiles
相关产品推荐
相关产品推荐

