Подтвердить что ты не робот

Django self.client.login(...) не работает в модульных тестах

Я создал пользователей для своих модульных тестов двумя способами:

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', '[email protected]', 'simpson') 

Обратите внимание, что в обоих случаях пароль является simpson.

Я проверил, что эта информация снова и снова загружается в тестовую базу данных. Я могу захватить объект User с помощью User.objects.get. Я могу проверить правильность пароля, используя "check_password". Пользователь активен.

Тем не менее, неизменно, self.client.login(username = 'homer', password = 'simpson') FAILS. Я не понимаю, почему. Я думаю, что я прочитал каждую интернет-дискуссию, касающуюся этого. Может ли кто-нибудь помочь?

Код входа в мой unit test выглядит следующим образом:

    login = self.client.login(username='homer', password='simpson') 
    self.assertTrue(login) 

Спасибо.

4b9b3361

Ответ 1

Код, который не работает:

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')

Ответ 2

Более простым способом является использование 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])

Ответ 3

Вы можете проверить, как показано ниже,

from django.test import TransactionTestCase, Client

class UserHistoryTest(TransactionTestCase):
    self.user = User.objects.create(username='admin', password='[email protected]', email='[email protected]')
    self.client = Client() # May be you have missed this line

    def test_history(self):
        self.client.login(username=self.user.username, password='[email protected]')
        # 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)

Этот тестовый пример работал у меня.

Ответ 5

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 = '[email protected]'
        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)

Ответ 6

Если кто-то все еще следит за этим, я думаю, что атрибуты 'is_staff' и 'is_active' должны быть сохранены True для успешной регистрации......

self.user = User.objects.create(username='testuser',password='pwd',is_active=1,is_staff=1)