Тестирование питона декораторов?
-
02-10-2019 - |
Вопрос
Я пишу несколько модульных тестов для проекта 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')
То насмехаться Библиотека помогает здесь.
Другие советы
Таким образом, декоратор может быть проверен просто благодаря печати утки. Просто поставьте макет объекта к вызов Функция, которая, кажется, держит и действует как запрос, и посмотрите, если вы получите ожидаемое поведение.
Когда необходимо использовать модульные тесты, я бы сказал, что я бы сказал. Примером, который вы предоставляете, содержат такой базовый код, который можно сказать, что не нужно. Но опять же, стоимость тестирования такого класса, как это одинаково низкая.
Пример для неиталета Джанго
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)
В целом, подход, который я использовал, является следующим:
- Настройте ваш запрос.
- Создайте фиктивную функцию, чтобы позволить декораторную магию произойти (лямбда). Это то, где вы можете контролировать количество аргументов, которые в конечном итоге будут переданы в декоратор.
- Провести утверждение на основе ответа вашего декоратора.