测试Python装饰器?

Jam*_*a22 19 python django unit-testing decorator python-unittest

我正在为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')
Run Code Online (Sandbox Code Playgroud)

nkr*_*rkv 25

只是:

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')
Run Code Online (Sandbox Code Playgroud)

模拟库在这里帮助.