it-swarm.com.ru

login () в среде тестирования Django

Я начал использовать среду тестирования Django, и все работало нормально, пока я не начал тестировать аутентифицированные страницы.

Для простоты предположим, что это тест:

class SimpleTest(TestCase):
    def setUp(self):
        user = User.objects.create_user('temporary', '[email protected]', 'temporary')

    def test_secure_page(self):
        c = Client()
        print c.login(username='temporary', password='temporary')
        response = c.get('/users/secure/', follow=True)
        user = User.objects.get(username='temporary')
        self.assertEqual(response.context['email'], '[email protected]')

После того, как я запустил этот тест, он не прошел, и я увидел, что при возврате возвращаемого значения login () возвращается True , но response.content перенаправляется на страницу входа (если сбой при входе в систему аутентификации, декоратор перенаправляет на страницу входа) ). Я поставил точку останова в декораторе, который выполняет аутентификацию:

def authenticate(user):
    if user.is_authenticated():
        return True
    return False

и это действительно возвращает Ложь . Строка 4 в test_secure_page () правильно извлекает пользователя.

Это функция просмотра:

@user_passes_test(authenticate, login_url='/users/login')
def secure(request):
    user = request.user
    return render_to_response('secure.html', {'email': user.email})

Конечно, если я пытаюсь войти через приложение (вне теста), все работает нормально.

28
kevin

Проблема в том, что вы не передаете RequestContext в свой шаблон. 

Кроме того, вам, вероятно, следует использовать декоратор login_required и клиент, встроенный в класс TestCase.

Я бы переписал это так:

#views.py
from Django.contrib.auth.decorators import login_required
from Django.shortcuts import render
from Django.contrib.auth import get_user_model

@login_required(login_url='/users/login')
def secure(request):
    user = request.user
    return render(request, 'secure.html', {'email': user.email})



#tests.py
class SimpleTest(TestCase):
    def setUp(self):
        User = get_user_model()
        user = User.objects.create_user('temporary', '[email protected]', 'temporary')

    def test_secure_page(self):
        User = get_user_model()
        self.client.login(username='temporary', password='temporary')
        response = self.client.get('/manufacturers/', follow=True)
        user = User.objects.get(username='temporary')
        self.assertEqual(response.context['email'], '[email protected]')
27
Filip Jukić

Часто может быть полезно использовать пользовательский аутентификационный бэкэнд, который обходит любой тип аутентификации во время тестирования:

from Django.contrib.auth import get_user_model

class TestcaseUserBackend(object):
    def authenticate(self, testcase_user=None):
        return testcase_user

    def get_user(self, user_id):
        User = get_user_model()
        return User.objects.get(pk=user_id)

Затем во время тестов добавьте yourapp.auth_backends.TestcaseUserBackend к своему AUTHENTICATION_BACKENDS:

AUTHENTICATION_BACKENDS = [
    "akindi.testing.auth_backends.TestcaseUserBackend",
]

Затем во время тестов вы можете просто позвонить:

from Django.contrib.auth import login
user = User.objects.get(…)
login(testcase_user=user)
11
David Wolever

Аутентификация на основе токена: Я был в той же ситуации. Я нашел sloution, в котором фактически я генерировал пользователя для входа в систему в методе setUp. Затем в тестовых методах я попытался получить токен и передал его вместе с данными запроса. ,.

настроить:

1> создать пользователя ех.
self.pravesh = User.objects.create(email='[email protected]',first_name='Pravesh',last_name='aaabbb',phone='5456165156',phonecountrycode='91')  

2> установить пароль для пользователя

Метод испытания:  

1> создать клиента
ех.
client.login(email=self.pravesh.email, password=self.password)

2> получить токен (в случае аутентификации токена) бывший
token = Token.objects.create(user=self.pravesh) 

2> передать информацию для входа бывший 

`response = client.post(
        reverse('account:post-data'),
        data = json.dumps(self.data),
        HTTP_AUTHORIZATION='Token {}'.format(token),
        content_type = 'application/json'
    )`    
0
OpenHub