我在Django(4.2.1)中使用djangorestframework
版本3.14.0测试API端点。
我们有这样的代码:
from django.core.management import call_command
from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.test import APITestCase
from account.models import Member, Organization, PhoneNumber
from authorization.models import AuthSMSCode
class SetUp(APITestCase):
@classmethod
def setUpTestData(cls):
# super().setUpClass()
cls.username = 'sudo'
cls.member = Member.objects.create_user(first_name='DefaultUser', email='default@gmail.com')
cls.organization = Organization.objects.create(name="Google", legal_address='1040 Brussels')
cls.member.organizations.add(cls.organization)
cls.member.save()
cls.organization.save()
cls.phone_number = PhoneNumber.objects.create(number='9999999999', member=cls.member)
code = 12345
cls.smscode = AuthSMSCode.objects.create(value=code, phone_number=cls.phone_number)
Token.objects.create(user=cls.member)
call_command('create_default_roles')
class ApiTestCaseGroups(SetUp, APITestCase):
def test_authorized(self):
self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.member.auth_token.key)
url = ...
response = self.client.get(url, format='json', REMOTE_USER=self.username)
expected_output = ...
response_result = response.json()
self.maxDiff = None
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response_result, expected_output)
class ApiTestCaseMembers(SetUp, APITestCase):
def test_authorized(self):
self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.member.auth_token.key)
url = .....
response = self.client.get(url, format='json', REMOTE_USER=self.username)
expected_output = ...
response_result = response.json()
self.maxDiff = None
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response_result, expected_output)
如果我们将ApiTestCaseGroups
和ApitTestCaseMembers
作为类单独运行,它们可以正常工作。但是,当我们将整个文件作为测试manage.py test
运行时,它在测试№2 ApiTestCaseMembers
时失败,因为对象为空(它返回代码200,因此我们进行了身份验证,但response_result
内部没有对象)。
我看到了一些类似的问题,但这些解决方案在这里不起作用。我们应该朝什么方向去解决这个问题?
1条答案
按热度按时间uajslkp61#
问题出在主键上。Django在测试期间一直在创建和删除数据库,但新对象是由下一个主键(或id)创建的。因此,我没有使用硬编码的id,比如1,2,而是首先从安装程序中解析它们,然后将其放入测试本身。