4

我正在尝试为使用 Django REST Framework 编写的 REST API 编写一些功能测试。不过,它对那个框架并不是很具体,因为它主要是一般的 Django 东西。

这就是我想做的

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

测试.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 中执行?

4

1 回答 1

9

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

于 2013-08-01T15:48:43.033 回答