2012-02-17 28 views
18

En una prueba django escrita, ¿cómo puedo obtener el usuario registrado actualmente?django - obtener usuario registrado en el cliente de prueba

Por ejemplo, esta es la prueba de que quiero escribir:

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 

así que quiero ser capaz de decir algo como ...

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

(pero no puedo)

la forma en que he codificado por el momento es la siguiente:

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

Esto se basa en la suposición de que request.user es el mismo que un objeto de usuario particular. Supongo que está bien, pero parece un poco torpe.

¿Hay alguna forma de evitar la suposición?

Respuesta

24

El cliente de prueba es independiente de la solicitud. No contiene información inherentemente acerca de qué usuarios están conectados. (Tampoco lo hace su servidor web real o el servidor de desarrollo Django, por razones obvias, y esas mismas razones se aplican aquí).

login es simplemente un método de conveniencia en el cliente de prueba para imitar esencialmente una POST a /login/ con las credenciales de usuario definidas. Nada mas.

El usuario real está disponible en el request como en una vista. Sin embargo, dado que no tiene acceso directo a la vista, Django hace que request esté disponible en la respuesta de la vista. Después de que realmente utiliza el cliente de prueba para cargar una vista, puede almacenar el resultado y luego obtener el usuario a través de:

response.request.user 

Las versiones más recientes de Django usará:

response.context["user"] 
+3

Mi respuesta no tiene usuario en el diccionario de solicitudes. – powlo

+0

Lo mismo aquí. No existe. –

+17

Bien amigos. Agregué esta respuesta ** 2 AÑOS ** atrás. Como era de esperar, Django aparentemente ha cambiado * solo un poco * desde entonces (como 3, contarlos, 3 revisiones principales). Esa no es una razón para comenzar a rechazar mi respuesta. http://stackoverflow.com/privileges/vote-down –

27

En realidad se puede' t acceder al usuario actual a través de una respuesta de cliente de prueba.

Sin embargo, se puede comprobar si un usuario ha iniciado sesión en la inspección de self.client.session hará:.

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

Hay una more detailed answer para esto.

+0

gracias - los carteles de arriba habían coro alegremente la respuesta "después de llamar a la vista y obtener una respuesta en su caso de prueba". – Phlip

+0

A [respuesta a esa respuesta] (http://stackoverflow.com/a/35871564/307511) demuestra que uno puede realmente obtener el usuario actual. – emyller

+0

@emyller no dude en editar mi respuesta. ¯ \ _ (ツ) _/¯ – hso

0

Puede log in with a test user así:

from django.contrib.auth.models import User 
user = User.objects.create_user('foo', '[email protected]', 'bar') 
self.client.login(username='foo', password='bar') 

Ahora, sólo puede utilizar user en sus pruebas:

self.assertEqual(created_model_object.user, user)

4

No sé qué versión está utilizando. Desde 1.10.2, hay un atributo wsgi_request en response, sirve como objeto request en su vista.

por lo que es muy sencillo de conseguir usuario conectado:

response.wsgi_request.user 
Cuestiones relacionadas