Django Test Client client.post()在我的测试用例中发送GET请求

时间:2019-04-26 05:24:15

标签: python django testing post client

如何使用Django test Client提交POST请求?我只想测试我的应用程序的登录功能。我很奇怪 response = self.client.post(reverse('rbac:login'), data=data) 在我的测试用例中,我想对其进行验证,所以我打印 response.status_code 。实际上,它应该返回302 coz,应该转到另一页。但返回200。这种情况发生在我使用“ python manage.py test testmodel ”进行测试时。但是,如果我使用“ python manage.py shell ”制作一个InteractiveConsole并编写完全相同的代码,它将最后返回302。

我几乎尝试了堆栈溢出提供的所有方法,例如更改网址,在我发帖时提供内容类型。...但是这些没有意义。

from django.test import TestCase
from django.test.utils import setup_test_environment,teardown_test_environment
from django.test import Client
from django.urls import reverse
import django
from rbac.models import RbacUser, RbacRole
from system_module.models import Redeploy
from urllib import urlencode
class CreateUser(TestCase):
    @classmethod
    def setUp(self):
        self.client = Client()

    def test_create_user(self):
        data = {"Username": "admin_xy", "Password": "aaa"}

        response = self.client.post(reverse('rbac:login'), data=data)
        print response

显示200 ..... 但是,在交互式控制台中:

>>> response = client.post(reverse('rbac:login'), data=data)
>>> print response.status_code                                                                                                                 
302

它显示正确的结果。 我想知道如何解决这个烦人的问题。谢谢

我希望当我使用测试文件测试我的测试用例时,它可以正常工作。...就像显示302代码一样。

2 个答案:

答案 0 :(得分:0)

您可以将follow = True设置为.post函数,如文档https://docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.Client.get

中所述
response = c.post('/redirect_me/', follow=True)
response.redirect_chain
[('http://testserver/next/', 302), ('http://testserver/final/', 302)]

它允许您通过response.redirect_chain访问重定向链。如果重定向链不包含重定向,则您在测试中的行为与在Shell中的行为不同。

答案 1 :(得分:0)

在使用客户端发送POST或GET请求之前,首先需要创建用户以使用户处于活动状态并提供必要的权限,然后通过客户端登录,然后发送发布请求。

例如:self.client.login(username='username', 'password'='password)