Django - войти в тестовый клиент
В письменном тесте django, как я могу получить текущего зарегистрированного пользователя?
Например, это тест, который я хочу написать:
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
Итак, я хочу сказать что-то вроде...
self.assertEqual(object.author, self.client.user)
(но я не могу)
То, как я его закодировал в данный момент, выглядит следующим образом:
self.client.login(username='Adam', password='password')
self.user = User.objects.get(username='Adam')
#create an object
self.assertEqual(object.author, self.user)
Это полагается на предположение, что request.user совпадает с конкретным пользовательским объектом. Думаю, все в порядке, но кажется немного неуклюжим.
Во всяком случае, чтобы избежать предположения?
Ответы
Ответ 1
Клиент теста является агностиком запроса. Он по сути не содержит информацию о том, что пользователи вошли в систему. (И ваш фактический веб-сервер или сервер Django dev, по очевидным причинам, и те же причины применяются здесь).
login
- это просто удобный метод для тестового клиента, который по существу имитирует POST для /login/
с определенными учетными данными пользователя. Ничего больше.
Фактический пользователь доступен на request
, как в представлении. Однако, поскольку у вас нет прямого доступа к представлению, Django делает request
доступным для ответа на просмотр. После того, как вы фактически используете тестовый клиент для загрузки представления, вы можете сохранить результат, а затем получить пользователя через:
response.request.user
В более поздних версиях Django будет использоваться:
response.context["user"]
Ответ 2
Фактически вы не можете получить доступ к текущему пользователю через ответ тестового клиента.
Однако вы можете проверить, зарегистрирован ли какой-либо пользователь. Проверка self.client.session
будет выполнять:
self.client.session['_auth_user_id']
>>> 1
Для этого есть более подробный ответ.
Ответ 3
Я не знаю, какую версию вы используете. Начиная с 1.10.2 в response
присутствует атрибут wsgi_request
, он служит в качестве объекта request
в вашем представлении.
Так что очень просто войти в систему пользователя:
response.wsgi_request.user
Ответ 4
войдите с помощью тестового пользователя:
from django.contrib.auth.models import User
user = User.objects.create_user('foo', '[email protected]', 'bar')
self.client.login(username='foo', password='bar')
Теперь вы можете просто использовать user
в своих тестах:
self.assertEqual(created_model_object.user, user)