【问题标题】:Django testing: RequestFactory() follow redirectDjango 测试:RequestFactory() 跟随重定向
【发布时间】:2018-05-03 15:42:55
【问题描述】:

在 Django 中,我有一个视图,它将重定向到某些用户的注册页面,我想为此编写一个测试。

用于测试的标准request.client.get 不允许我指定用户(它只是默认为anonymous_user?),所以我无法测试行为。

使用RequestFactory(),我可以指定request.user。但是,它没有遵循重定向并且测试失败。

from .views import my_view
from django.test import RequestFactory()

def test_mytest(self):
    user = create_guest_user()
    self.factory = RequestFactory()
    request = self.factory.get(reverse('my_view'), follow=True)
    request.user = user
    response = my_view(request)
    self.assertContains(response, "page where redirected should contain this")

它在最后一行失败并显示以下错误消息:

AssertionError: 302 != 200 : Couldn't retrieve content: Response code was 302 (expected 200)

任何想法如何做到这一点?

编辑:据我所知,这不是重复的,因为它指的是 RequestFactory(),这与 self.client.get 不同(follow=True 将解决问题)。

【问题讨论】:

  • 不是重复的。在那种情况下,焦点是SimpleTestCase 在这里我们正在谈论RequestFactory 类。这也是关于遵循重定向而不是assertRedirect
  • 您不能发出 RequestFactory() 关注请求。它只是创建了一个request 对象。如果您使用RequestFactory,那么您需要检查响应代码,获取重定向位置,将该位置解析为视图,然后调用该视图。 client 旨在为您处理所有这些问题,因此您应该改用它。
  • 感谢 Alasdair - 这与下面的建议一起帮助了很多登录匿名用户。

标签: python django django-testing


【解决方案1】:

要验证默认的 Django client,您可以在 client 上使用 force_login 方法:

user = create_guest_user()
self.client.force_login(user)

如果您的站点使用 Django 的身份验证系统,您可以使用 force_login() 方法来模拟用户登录站点的效果。当测试要求用户登录并且用户登录方式的详细信息并不重要时,请使用此方法而不是 login()。

要使用测试client 遵循重定向(或不遵循),您必须使用follow 参数,如下所述:https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.Client.get

self.client.get(url, follow=True)

如果将 follow 设置为 True,则客户端将遵循任何重定向,并且将在包含中间 url 和状态代码元组的响应对象中设置 redirect_chain 属性。

所以你的完整代码应该是这样的:

from django.test import TestCase

class MyTestCase(TestCase):
    def test_mytest(self):
        user = create_guest_user()
        self.client.force_login(user)
        response = self.client.get(reverse('my_view'), follow=True)
        # Do your assertions on the response here

【讨论】:

  • 这个答案不值得反对。如果 OP 想要跟踪重定向,那么他们应该使用 client 而不是 RequestFactory()。这个答案展示了如何在使用客户端时避免匿名用户问题。
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多