Я пишу некоторые модульные тесты на проект Django, и я задавался вопросом если его возможное (или необходимый?) для тестирования некоторых декораторов, которых я записал для него.
Вот пример декоратора, которого я записал:
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')
Просто:
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')
Здесь поможет библиотека mock.
Такой декоратор можно протестировать просто благодаря утиной печати. Просто предоставьте фиктивный объект функции call , который, кажется, удерживает и действует как запрос, и посмотрите, получите ли вы ожидаемое поведение.
Я бы сказал, что когда необходимо использовать юнит-тесты, это довольно индивидуально. Приведенный вами пример содержит такой базовый код, что можно сказать, что в нем нет необходимости. Но опять же, стоимость тестирования такого класса также невелика.