2010-04-14 16 views
5

Estoy escribiendo pruebas funcionales detalladas para mis vistas para complementar las pruebas unitarias en mis modelos. Es un proyecto de Django y estoy usando el marco de prueba integrado de Django con unittest. Obviamente, una de las cosas importantes a verificar en estas pruebas funcionales es que los permisos están configurados correctamente. Con esto en mente, estoy intentando algo como esto:Detección de errores de permiso en pruebas de django

anonclient = Client() 
userclient = Client() 
userclient.login(username='test_user', password='test') 
adminclient = Client() 
adminclient.login(username='test_admin', password='test') 

path = "/path/to/my/page" 
anonresponse = anonclient.get(path) 
userresponse = userclient.get(path) 
adminresponse = adminclient.get(path) 

tengo que ser capaz de confirmar que el anonclient y userclient fueron ambos negaron el permiso, mientras que el adminclient funcionaba correctamente. Howerver, no puedo encontrar una manera de probar que esto ha sucedido robustamente!

Al principio decidí verificar que la respuesta fuera una redirección 302 (porque se redirecciona un efecto secundario de fallar la comprobación de permisos), pero esto significa que es imposible distinguir la funcionalidad que redirige automáticamente al usuario y un verificación de permisos fallidos (No puedo usar self.assertRedirects (response, url) porque la url de destino puede anularse mediante el parámetro login_url del decorador permission_required en la vista!)

Tal vez debería considerar ampliar el decorador user_passes_test para que agregue una propiedad para el objeto de respuesta si la prueba falla? Esto podría verificarse en las pruebas. De lo contrario, tendré que determinar si la solicitud fue exitosa al verificar si los efectos secundarios de la solicitud se han producido. Hacerlo de esta manera funcionará, pero será extremadamente largo, especialmente con muchos de estos controles.

No me puedo imaginar que soy la primera persona en encontrarse con este problema, ¿cuál es la forma correcta de tratar este problema o qué me he perdido?

Muchas gracias!

Respuesta

1

El cliente de prueba django devuelve un booleano cuando llama al método de inicio de sesión, que le indica si el inicio de sesión fue exitoso.

[17] >>> from django.test import Client 
[18] >>> c = Client() 
[19] >>> c.login(username='superuser', password='bar') 
[19] : False 
[20] >>> c.login(username='superuser', password='correct_password') 
[20] : True 
+0

Gracias Justin, pero has entendido mal mi pregunta - Necesito comprobar si la posterior obtención es exitosa o si se produce un error de permiso (con la redirección resultante). El inicio de sesión funciona bien - Necesito poder probar que la verificación de permisos funciona en la vista de Django. – adamnfish

+0

Debería poder verificar si la url resultante es a la que intentó acceder. my_url = '/ foo /' resp = c.get (my_url) Luego puede consultar el objeto '' resp'' para ver cosas relacionadas con su página resultante. docs.djangoproject.com/en/dev/topics/testing/# testing-responses Específicamente, código de estado, verificando que se usó la plantilla correcta, etc. ¡Espero que ayude! –

+0

Como dije, me gustaría poder diferenciar entre una vista que sirve una redirección y una vista redireccionada por el usuario que falla una prueba. Soy consciente de que puedo verificar los efectos secundarios u oler la página resultante (de hecho, esto es lo que estoy haciendo por ahora) pero me preguntaba si hay una forma de detectar que el usuario falló una prueba y la vista no fue correr, directamente. Parece que no es así por ahora, así que supongo que enviaré una solicitud de función después de la versión 1.2 o rodaré yo mismo un parche user_passes_test decorator. – adamnfish

1

El permission_required decorador y PermissionRequiredMixin tienen un parámetro raise_exception.

Una posible manera de tratar con él es tener algo así como una opción PERMISSIONS_RAISE_EXCEPTION=True config en su settings_test.py (si está utilizando unos ajustes separados para las ejecuciones de prueba y tiene

from django.conf import settings 

@permission_required('<perm>', 
        raise_exception=settings.PERMISSIONS_RAISE_EXCEPTION) 
def your_view(...) 
    pass 

class YourView(PermissionRequired): 
    raise_exception = settings.PERMISSIONS_RAISE_EXCEPTION 

De esta manera puede luego coger la excepción/prueba para el 403 en sus pruebas y retener la redirección a la página de inicio de sesión.

client.login('user', 'blah') 
response = client.get('/yourview') 
assertNot(403, response.status_code) 

agregar la configuración a todos sus permission_required decoradores podría no ser a su gusto, se siente un poco como su código de prueba agregado en su fuente, pero es la única forma que he visto hasta ahora.

Cuestiones relacionadas