que - ¿Probar decoradores de Python?
self en python (3)
Ejemplo para la prueba de unidad de Django
class TestCaseExample(TestCase):
def test_decorator(self):
request = HttpRequest()
# Set the required properties of your request
function = lambda x: x
decorator = login_required(function)
response = decorator(request)
self.assertRedirects(response)
En general, el enfoque que he utilizado es el siguiente:
- Configure su solicitud.
- Crea una función ficticia para permitir que ocurra la magia decoradora (lambda). Aquí es donde puede controlar el número de argumentos que eventualmente se pasarán al decorador.
- Realiza una afirmación basada en la respuesta de tu decorador.
Estoy escribiendo algunas pruebas unitarias para un proyecto de Django, y me preguntaba si es posible (¿o es necesario?) Probar algunos de los decoradores que escribí para él.
Aquí hay un ejemplo de un decorador que escribí:
class login_required(object):
def __init__(self, f):
self.f = f
def __call__(self, *args):
request = args[0]
if request.user and request.user.is_authenticated():
return self.f(*args)
return redirect(''/login'')
Simplemente:
from nose.tools import assert_equal
from mock import Mock
class TestLoginRequired(object):
def test_no_user(self):
func = Mock()
decorated_func = login_required(func)
request = prepare_request_without_user()
response = decorated_func(request)
assert not func.called
# assert response is redirect
def test_bad_user(self):
func = Mock()
decorated_func = login_required(func)
request = prepare_request_with_non_authenticated_user()
response = decorated_func(request)
assert not func.called
# assert response is redirect
def test_ok(self):
func = Mock(return_value=''my response'')
decorated_func = login_required(func)
request = prepare_request_with_ok_user()
response = decorated_func(request)
func.assert_called_with(request)
assert_equal(response, ''my response'')
La biblioteca mock ayuda aquí.
Un decorador como este podría ser probado simplemente gracias a la tipificación de pato. Simplemente proporcione un objeto simulado a la función de llamada , que parece mantener y actuar como una solicitud, y ver si obtiene el comportamiento esperado.
Cuando es necesario usar pruebas unitarias es bastante individual, diría yo. El ejemplo que das contiene un código tan básico que se podría decir que no es necesario. Pero, de nuevo, el costo de probar una clase como esta es igualmente bajo.