Я создал пользователей для своих модульных тестов двумя способами:
1) Создайте фикстуру для "auth.user", которая выглядит примерно так:
{
"pk": 1,
"model": "auth.user",
"fields": {
"username": "homer",
"is_active": 1,
"password":
"sha1$72cd3$4935449e2cd7efb8b3723fb9958fe3bb100a30f2",
...
}
}
Я не учел, казалось бы, неважные части.
2) Используйте create_user в функции setUp (хотя я бы предпочел сохранить все в своем классе фикстур):
def setUp(self):
User.objects.create_user('homer', 'ho...@simpson.net', 'simpson')
Обратите внимание, что в обоих случаях используется пароль Simpson.
Я проверял, что эта информация снова и снова правильно загружается в тестовую базу данных. Я могу получить объект User с помощью User.objects.get. Я могу проверить правильный пароль, используя "check_password". Пользователь активен.
Тем не менее, self.client.login (username = 'homer', password = 'simpson') неизменно НЕ ИСПОЛЬЗУЕТСЯ. Я не понимаю, почему. Я думаю, что прочитал все обсуждения в Интернете по этому поводу. Кто-нибудь может помочь?
Код входа в мой модульный тест выглядит так:
login = self.client.login(username='homer', password='simpson')
self.assertTrue(login)
Благодарю.
Ответы:
Код, который не работает:
from django.contrib.auth.models import User from django.test import Client user = User.objects.create(username='testuser', password='12345') c = Client() logged_in = c.login(username='testuser', password='12345')
Почему не работает?
В приведенном выше фрагменте при
User
создании фактический хэш пароля устанавливается равным12345
. Когда клиент вызываетlogin
метод, значениеpassword
аргумента,,12345
передается через хеш-функцию, в результате получается что-то вродеhash('12345') = 'adkfh5lkad438....'
Затем он сравнивается с хешем, хранящимся в базе данных, и клиенту отказывают в доступе, потому что
'adkfh5lkad438....' != '12345'
Решение
Правильнее всего вызвать
set_password
функцию, которая передает заданную строку через хеш-функцию и сохраняет результат вUser.password
.Кроме того, после вызова
set_password
мы должны сохранить обновленныйUser
объект в базе данных:user = User.objects.create(username='testuser') user.set_password('12345') user.save() c = Client() logged_in = c.login(username='testuser', password='12345')
источник
User.objects.create_superuser()
и тем,User.objects.create_user()
что выполняете именно этотset_password()
звонок.User.objects.get_or_create()
выполняет требуемыйset_password()
вызовБолее простой способ - использовать
force_login
новое в Django 1.9.force_login(user, backend=None)
Например:
class LoginView(TestCase): def setUp(self): self.client.force_login(User.objects.get_or_create(username='testuser')[0])
источник
Можете ли вы проверить, как показано ниже,
from django.test import TransactionTestCase, Client class UserHistoryTest(TransactionTestCase): self.user = User.objects.create(username='admin', password='pass@123', email='admin@admin.com') self.client = Client() # May be you have missed this line def test_history(self): self.client.login(username=self.user.username, password='pass@123') # get_history function having login_required decorator response = self.client.post(reverse('get_history'), {'user_id': self.user.id}) self.assertEqual(response.status_code, 200)
Этот тестовый пример сработал для меня.
источник
Проверьте, что
django.contrib.sessions
это добавлено,INSTALLED_APPS
потому чтоclient.login()
проверяет, что это так, и всегда будет возвращать false, если это не так:https://docs.djangoproject.com/es/1.9/topics/http/sessions/#enables-sessions
источник
django.contrib.sessions.middleware.SessionMiddleware
в классах промежуточного программного обеспечения вы все равно не можете войти через django.test.Client. На поиск этого ответа у меня уходит неделяfrom django.test import TestCase from django.contrib.auth.models import User from django.test import Client class MyProfile(TestCase): @classmethod def setUpClass(self): self.username = 'dummy' + data + '@gmail.com' self.password = 'Dummy@123' user = User.objects.create(username=self.username) user.set_password(self.password) user.save() c = Client() self.client_object = c.login(username=self.username, password=self.password) self.content_type = "application/json" response = self.client_object.post('/api/my-profile/', content_type=self.content_type)
источник
Если кто-то все еще следит за этим, я думаю, что атрибуты is_staff и is_active должны быть сохранены True для успешного входа в систему ...
self.user = User.objects.create(username='testuser',password='pwd',is_active=1,is_staff=1)
источник
is_staff
что определяет, предоставляется ли доступ к панели администратора в целом. Как видите, данные в исходной публикации уже есть,is_active = 1
и они также используются по умолчанию дляUser.objects.create()
.