更新:我被遗忘了,但我仍然认为我的答案更好,所以让我解释一下。
我仍然认为 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 测试)。