测试Python装饰符?

2024-04-20 12:23:24 发布

您现在位置: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')

Tags: 项目djangoselfreturnrequestdefrequiredargs
3条回答

Django的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. 创建一个虚拟函数以允许装饰器魔术发生(lambda)。在这里,您可以控制最终传递给decorator的参数的数量。
  3. 根据装饰器的响应执行断言。

简单地说:

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库在这里有帮助。

像这样的装饰器可能只需要通过duck输入就可以进行测试。只需为call函数提供一个模拟对象,该对象看起来像一个请求,并作为一个请求执行,然后查看是否获得了预期的行为。

当有必要使用单元测试时,我会说它是非常独立的。你给出的例子包含了这样的基本代码,人们可能会说这是不必要的。但是,同样,测试这样一个类的成本也很低。

相关问题 更多 >