django - авторизация пользователя в тестовом клиенте

В письменном тесте django, как я могу узнать 9X_test текущего пользователя, вошедшего в систему?

Например, это 9X_test тест, который я хочу написать:

def test_author_set_once(self):
    self.client.login(username='Adam', password='password')
    #create an object and test the author is adam
    self.client.login(username='Barry', password='password')
    #modify the first object and test that the author has not changed

Итак, я хочу 9X_testing сказать что-то вроде ...

self.assertEqual(object.author, self.client.user)

(но я не могу)

На 9X_testing данный момент я его закодировал следующим 9X_django образом:

self.client.login(username='Adam', password='password')
self.user = User.objects.get(username='Adam')
#create an object 
self.assertEqual(object.author, self.user)

Это основано на предположении, что 9X_test request.user совпадает с конкретным объектом 9X_software-testing пользователя. Думаю, это нормально, но кажется 9X_django немного неуклюжим.

Есть ли способ избежать 9X_testing этого предположения?

36
0
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: django - авторизация пользователя в тестовом клиенте

Тестовый клиент не зависит от запросов. По 9X_software-testing сути, он не содержит информации о том, какие 9X_software-testing пользователи вошли в систему (как и ваш 9X_tests фактический веб-сервер или сервер разработки 9X_django Django, по очевидным причинам, и те же самые 9X_testing причины применимы и здесь).

login - это просто 9X_test удобный метод на тестовом клиенте, который 9X_test по сути имитирует POST-запрос на /login/ с определенными 9X_software-testing учетными данными пользователя. Больше ничего.

Фактический 9X_tests пользователь доступен в request, как и в представлении. Однако, поскольку 9X_software-testing у вас нет прямого доступа к представлению, Django 9X_tests делает request доступным в ответе представления. После 9X_software-testing того, как вы действительно используете тестовый 9X_testing клиент для загрузки представления, вы можете 9X_testing сохранить результат, а затем получить пользователя 9X_testing через:

response.request.user

Более свежие версии Django будут использовать:

response.wsgi_request.user

51
5

  • И давайте не будем забывать, что именно поэтому редактирование доступно * всем *, даже если вам просто нужно дождаться утверждения вашего редактировани ...

Ответ #2

Ответ на вопрос: django - авторизация пользователя в тестовом клиенте

На самом деле вы не можете получить доступ 9X_testing к текущему пользователю через тестовый ответ 9X_software-testing клиента.

Однако вы можете проверить, вошел 9X_django ли какой-либо пользователь в систему. Проверка 9X_software-testing self.client.session сделает:

self.client.session['_auth_user_id']
>>> 1

Для этого есть more detailed answer.

40
0

Ответ #3

Ответ на вопрос: django - авторизация пользователя в тестовом клиенте

Я не знаю, какую версию вы используете. Начиная 9X_django с 1.10.2, в response есть атрибут wsgi_request, он служит в 9X_test вашем представлении как объект request.

Итак, войти 9X_tests в систему очень просто:

response.wsgi_request.user

12
0

Ответ #4

Ответ на вопрос: django - авторизация пользователя в тестовом клиенте

Вы можете log in with a test user вот так:

from django.contrib.auth.models import User
user = User.objects.create_user('foo', 'myemail@test.com', 'bar')
self.client.login(username='foo', password='bar')

Теперь вы можете просто 9X_testing использовать user в своих тестах:

self.assertEqual(created_model_object.user, user)

9
0