Как определить заголовки для авторизации в тестировании 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.
Но после того, как я запускаю тест, он показывает эту ошибку:
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, несмотря на наличие профилей в вашей базе данных. Это утверждает даже тот факт, что для тестирования используется отдельная база данных.