编写Django RESTful API的功能测试

时间:2013-08-01 11:14:20

标签: django functional-testing django-rest-framework django-testing

我正在尝试为使用Django REST Framework编写的REST API编写一些功能测试。然而,它并不是特定于该框架,因为它主要是一般的Django。

这就是我想做的事情

  1. 在测试类的setUp方法中创建用户
  2. 使用测试客户端
  3. 从API请求用户令牌

    tests.py

    from django.test import LiveServerTestCase
    
    from django.contrib.auth.models import User
    from django.test.client import Client
    from rest_framework.authtoken.models import Token
    
    class TokenAuthentication(LiveServerTestCase):
        def setUp(self):
            user = User.objects.create(username='foo', password='password', email="foo@example.com")
            user.save()
            self.c = Client()
    
        def test_get_auth_token(self):
            user = User.objects.get(username="foo")
            print user # this outputs foo
            print Token.objects.get(user_id = user.pk) # this outputs a normal looking token
            response = self.c.post("/api-token-auth/", {'username': 'foo', 'password': 'password'})
            print response.status_code # this outputs 400
            self.assertEqual(response.status_code, 200, "User couldn't log in")
    

    当我运行测试时,它返回状态400而不是200,因此用户未经过身份验证。如果我输入已经在数据库中的用户的凭据,它会通过。所以我假设在测试类中创建的记录只能在它自己的方法中访问,这可能是因为它是为单元测试而设计的。但是我使用数据库中的数据来执行测试,如果数据发生变化,它将会失败。

    在Django中,如何在运行测试之前需要创建数据的功能测试?

1 个答案:

答案 0 :(得分:9)

您正在错误地创建用户。 User.objects.create以纯文本而不是通过散列机制设置密码。您应该使用User.objects.create_user来正确设置密码,以便您可以使用用户名和密码进行身份验证。