为Django身份验证的API视图编写TestCase

时间:2019-06-16 12:28:35

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

我已经在TestCase上成功编写了文件,并且工作得很好。

首先看看我的代码:

下面是我的tsc

tests.py

上面的代码片段工作正常,但是问题是..一旦我实施了身份验证系统,它就无法工作

下面是我的from django.shortcuts import reverse from rest_framework.test import APITestCase from ng.models import Contact class TestNoteApi(APITestCase): def setUp(self): # create movie self.contact = Contact(userId=254, name="The Space Between Us", phone=2017, email='doe@f.com') self.contact.save() def test_movie_creation(self): response = self.client.post(reverse('getAndPost'), { 'userId': 253, 'name': 'Bee Movie', 'phone': 2007, 'email': 'ad@kjfd.com' }) self.assertEqual(Contact.objects.count(), 2)

settings.py

如果我随意更改为REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ) } ,则测试效果很好,但如果保留AllowAny而不是IsAuthenticated,则该测试无效。

我希望即使我获得AllowAny的许可,测试也能很好地运行。

有人可以建议我该怎么做吗?我没有IsAuthenticated文件中要更改的内容或添加的内容。

1 个答案:

答案 0 :(得分:0)

您应该使用user方法创建setUp对象,并使用client.login()force_authenticate()进行经过身份验证的请求:

class TestNoteApi(APITestCase):
    def setUp(self):
        # create user
        self.user = User.objects.create(username="test", password="test") 
        # create movie
        self.contact = Contact(userId=254, name="The Space Between Us", phone=2017, email='doe@f.com')
        self.contact.save()

    def test_movie_creation(self):
        # authenticate client before request 
        self.client.login(username='test', password='test')
        # or 
        self.clint.force_authenticate(user=self.user)
        response = self.client.post(reverse('getAndPost'), {
            'userId': 253,
            'name': 'Bee Movie',
            'phone': 2007,
            'email': 'ad@kjfd.com'
        })
        self.assertEqual(Contact.objects.count(), 2)