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

Я пишу некоторые модульные тесты на проект 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')
19
задан Eli Courtwright 29 April 2010 в 15:45
поделиться

2 ответа

Просто:

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.

25
ответ дан 30 November 2019 в 04:24
поделиться

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

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

1
ответ дан 30 November 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: