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

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

Во всяком случае, чтобы избежать предположения?

4b9b3361

Ответ 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