2010-01-10 20 views
49

Tengo un código django que interactúa con objetos de solicitud u objetos de usuario. Por ejemplo algo como:Cómo simular usuarios y solicitudes en django

foo_model_instance = models.get_or_create_foo_from_user(request.user) 

Si se va a probar con el intérprete de Python Django o en un unittest, ¿qué le pasa ahí? Aquí simplemente hará un objeto User, pero la necesidad de un objeto de solicitud falso también aparece con frecuencia.

Para el shell o para unittests:

  • ¿Cómo hacer que los usuarios simulados?
  • ¿Cómo se burla de las solicitudes?
+2

"Sigues usando esa palabra, pero no creo que signifique lo que piensas que significa ... "Creo que te refieres a" maqueta ". –

+7

@Mike: suena raro, pero creo que lo hizo bien. @pax: pásame a la línea final :( – mpen

+5

Yo ... Debo confesar que ... en el silencio de mi habitación ... a altas horas de la noche ... Yo ... sí, sí! Me burlo de los usuarios ! Todos ellos! @perrierismo: no nos burlamos de ti, simplemente estamos disfrutando de tu maravillosa elección de palabras. –

Respuesta

48

Para solicitarlo, utilizaría RequestFactory incluido con Django.

from django.test.client import RequestFactory 
rf = RequestFactory() 
get_request = rf.get('/hello/') 
post_request = rf.post('/submit/', {'foo': 'bar'}) 

para los usuarios, me gustaría utilizar django.contrib.auth.models.Usuario como @ozan sugirió y tal vez con factory boy para la velocidad (con el chico de fábrica puede optar por no guardar en DB)

+0

Esta es definitivamente la respuesta correcta ahora que RequestFactory está disponible. Con crédito a la respuesta de Ozan (que la instancia de los objetos reales es suficiente y deseable). No he usado Factory Boy, pero si está cerca de la calidad de Rail's Factory Girl, parece que sería una excelente opción. – Purrell

+0

La mejor solución que funcionó para mí en un script de migración django. Sin embargo, la versión actual requiere que se establezca 'request.user'. También para utilizar esta solicitud como una vista normal, es bueno tener 'request.csrf_processing_done = True' en la solicitud lista (para pasar las comprobaciones CSRF) – garmoncheg

38

¿Cómo se burla de los usuarios?

Inicialice un objeto django.contrib.auth.models.User. User.objects.create_user lo hace fácil.

¿Cómo se burla de las solicitudes?

Inicializar un objeto django.http.HttpRequest.

Por supuesto, hay atajos dependiendo de lo que quiere hacer. Si solo necesitas un objeto con un atributo user que apunta a un usuario, simplemente crea algo (cualquier cosa) y dale ese atributo.

+5

+1: ¿Simulacro? ¿Por qué simulacro? Utiliza el nombre real. –

+1

@ S.Lott es bueno usarlo lo real a veces, pero termina muy lento a medida que crece su proyecto. Es bueno tener pruebas simuladas que puede ejecutar en unos segundos en lugar de unos pocos minutos. –

+0

@TM: Tal vez esto es cierto en general. Pero el cliente de Django es muy rápido. ¿Tiene alguna alternativa y algunos puntos de referencia para mostrar el ahorro de tiempo? –

3

No es necesario que se burle de los usuarios, ya que puede crear uno dentro de su prueba: la base de datos se destruye una vez finalizada la prueba.

Para simular solicitudes, utilice this snippet de Simon Willison.

+0

Aunque estoy de acuerdo, generalmente puede salirse con la suya creando usuarios para sus pruebas, hay ocasiones en las que no desea hacerlo, o hacerlo queda fuera del alcance de la prueba. Si estoy probando que se deniega el permiso si un método auxiliar devuelve False, es incorrecto que lo vincule a la base de datos. Ese método de ayuda existe PORQUE no quiero saber sobre la representación de la base de datos. – yarbelk

6

Puede rodar sus propios simulacros, como ha sugerido Anurag Uniyal, o puede utilizar un marco de burla.

En respuesta a los que dicen que puede crear un usuario ordinario como lo haría de todos modos en Django ... Sugeriría que esto anule el punto de la prueba unitaria. Una prueba de unidad no debe tocar la base de datos, pero al crear un usuario, ha cambiado la base de datos, por lo que nos gustaría simular una.

+0

Como mencionó Daniel, el corredor de prueba crea y destruye una base de datos de prueba para usted, por lo que no tiene que preocuparse por eso. – ozan

+3

Excepto si usa la base de datos, ya no es una prueba de unidad. Todavía puede ser una prueba de integración perfectamente válida, pero no es una prueba unitaria. –

+1

El problema es que crear y destruir una base de datos lleva tiempo. Quiero eventualmente ejecutar miles de pruebas en un abrir y cerrar de ojos, cada vez que hago un cambio. No quiero levantar una base de datos y una instancia de aplicación para ejecutar mis pruebas. –

Cuestiones relacionadas