django - войти в тестовый клиент - PullRequest
22 голосов
/ 17 февраля 2012

В письменном тесте 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 совпадает с конкретным объектом пользователя.Я думаю, это нормально, но кажется немного неуклюжим.

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

Ответы [ 4 ]

31 голосов
/ 17 февраля 2012

Тестовый клиент не зависит от запроса.По сути, он не содержит информацию о том, какие пользователи вошли в систему. (Ни ваш настоящий веб-сервер, ни сервер разработки Django, либо, по понятным причинам, и эти же причины применимы здесь).просто удобный метод на тестовом клиенте для имитации POST на /login/ с определенными учетными данными пользователя.Ничего больше.

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

response.request.user

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

response.context["user"]
30 голосов
/ 02 ноября 2012

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

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

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

Для этого есть более подробный ответ .

6 голосов
/ 07 апреля 2017

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

Так что войти в систему очень просто:

response.wsgi_request.user
1 голос
/ 06 апреля 2017

Вы можете войти в систему с тестовым пользователем примерно так:

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

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

self.assertEqual(created_model_object.user, user)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...