Тестирование Python Decorators? - PullRequest
       7

Тестирование Python Decorators?

19 голосов
/ 29 апреля 2010

Я пишу некоторые модульные тесты для проекта 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')

Ответы [ 3 ]

25 голосов
/ 30 апреля 2010

Просто:

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 .

1 голос
/ 29 апреля 2010

Декоратор, подобный этому, может быть проверен просто благодаря печатанию утки. Просто предоставьте фиктивный объект для функции call , которая, кажется, содержит и действует как запрос, и посмотрите, получите ли вы ожидаемое поведение.

Когда нужно использовать модульные тесты, я бы сказал, что это очень индивидуально. В приведенном вами примере содержится такой базовый код, что можно сказать, что в этом нет необходимости. Но опять же, стоимость тестирования такого класса одинаково низкая.

0 голосов
/ 06 марта 2014

Пример для UnitTest Джанго

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)

В общем, я использовал следующий подход:

  1. Настройте ваш запрос.
  2. Создание фиктивной функции, позволяющей магии декоратора происходить (лямбда). Здесь вы можете контролировать количество аргументов, которые в конечном итоге будут переданы в декоратор.
  3. Выполните утверждение на основе ответа вашего декоратора.
...