Как определить заголовки для авторизации в тестировании django?

Я хочу написать тестовый пример для функции в моем views в моем проекте Django. Я только начинающий в этой области, я изменил свой settings.py и добавил следующую строку кода в словарь DATABASES, а также создал нового пользователя с помощью оболочки MySQL на основе этого поста:

'TEST': {
    'NAME': 'test_sepantadb',
}

В функции есть try/catch для проверки авторизации с помощью request.headers. Вот код API:

@api_view(['GET'])
def Get_users(request, **kwargs):
    try:
        user = request.headers['Authorization']
        p = Profile.objects.get(username=user)
    except Exception as e:
        print(e)
        return Response(status=status.HTTP_401_UNAUTHORIZED)
    
    users = Device.objects.filter(owner=p)
    res = []
    for u in users:
        user_inf = {}
        try:
            pdm = PersonDeviceMapper.objects.filter(device=u)[0]
            prof = pdm.person
            user_inf['name'] = prof.name
            user_inf['username'] = prof.username
        except Exception as e:
            print(e)
            user_inf['name'] = u.name
            user_inf['username'] = "default_" + str(u.id)
        user_inf['created_at'] = u.created_at
        user_inf['id'] = u.id
        user_inf['device_id'] = u.device_id
        res.append(user_inf)
    return Response(res)

А вот код в models.py для Profile class:

class Profile(models.Model):
    GENDER_MALE = 1
    GENDER_FEMALE = 2
    GENDER_CHOICES = [
        (GENDER_MALE, _("Male")),
        (GENDER_FEMALE, _("Female")),
    ]
    code = models.IntegerField(null=True, blank=True)
    username = models.CharField(max_length=128, null=False, blank=False, unique=True)
    password = models.CharField(max_length=128, null=False, blank=False)
    name = models.CharField(max_length=50, null=True, blank=True)
    lastname = models.CharField(max_length=50, null=True, blank=True)
    birthday = models.DateField(null=True, blank=True)
    gender = models.PositiveSmallIntegerField(choices=GENDER_CHOICES, null=True, blank=True)
    phone = models.CharField(max_length=32, null=True, blank=True)
    address = models.CharField(max_length=255, null=True, blank=True)
    number = models.CharField(max_length=32, null=True, blank=True)
    city = models.CharField(max_length=50, null=True, blank=True)
    zip = models.CharField(max_length=30, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    def __str__(self):
        return self.username

Я не использовал стандартный User в Django, и вот код для моего теста:

class TestViews(TestCase):
    def setUp(self):
        self.client = Client()
        self.users_url = reverse('react:get users')

    def test_users_GET(self):
        headers = {'AUTHORIZATION': 'demo'}
        response = self.client.get(self.users_url, **headers)
        self.assertEqual(response.status_code, 200)

demo - это имя учетной записи, которую я использую для тестирования response в postman. enter image description here Но после того, как я запускаю тест, он показывает эту ошибку:

Failure
Traceback (most recent call last):
  File "D:\ABDAL\sepanta\react\tests\test_views.py", line 26, in test_users_GET
    self.assertEqual(response.status_code, 200)
AssertionError: 401 != 200

Я не смог понять причину этой проблемы, и я также искал похожие проблемы, но они мне не помогли. Создает ли Django новую базу данных во время тестирования API? И причина может быть в том, что база данных пуста.

Django всегда создает отдельную базу данных для тестирования. Чтобы вы знали, эта база данных также всегда уничтожается после выполнения тестов. Однако вы можете указать флаг для сохранения тестовой базы данных. Вы можете прочитать больше об этом здесь

Чтобы решить вашу проблему, вам нужно создать новый профиль в вашем тесте (test fixtures). Обычно вы хотите сделать это в методе setUp.

NB: Созданный профиль не имеет ничего общего с вашей обычной или реальной базой данных, и на самом деле вы можете проверить id профиля и понять, что он будет равен 1, несмотря на наличие профилей в вашей базе данных. Это утверждает даже тот факт, что для тестирования используется отдельная база данных.

Вернуться на верх