【问题标题】:How to unit test that a function has been decorated?如何对一个函数进行单元测试?
【发布时间】:2019-04-15 16:12:33
【问题描述】:

我有一个这样装饰的视图:

@check_has_permission('is_manager')
def view():
   pass

装饰器看起来像这样:

def check_has_permission(group=None):
    def can_user_access(user):
        if user.is_authenticated():
            if group == 'is_staff':
                return user.is_staff()
            elif group == 'is_admin':
                return (
                    user.is_admin() or
                    user.is_staff()
                )
            elif group == 'is_manager':
                return (
                    user.is_manager() or
                    user.is_admin() or
                    user.is_staff()
                )
        return False
    return user_passes_test(can_user_access, login_url=login_url)

我如何编写单元测试来确认视图是用 check_has_permission 和一组 'is_manager' 装饰的?

我希望我可以为装饰器本身编写一组测试,然后我只需要确认我为它装饰的每个视图调用了正确的组。

【问题讨论】:

  • 到底是check_has_permission
  • 不要测试视图是否被装饰,这太元了。相反:使用生成的用户登录 django 客户端。测试经理用户是否在该视图中获得 HTTP 200 OK,而非经理用户获得 HTTP 403。
  • @wim 我经常重复使用装饰器,所以如果想测试一次而不是每个视图上的所有变体。
  • 你的装饰器在每个sn-p中都有不同的名字。我认为他们应该被命名为相同的?

标签: python django unit-testing python-decorators


【解决方案1】:

您需要添加一个接缝,您可以在其中进行测试。

如果你的装饰器看起来像这样:

def is_user_in_group(group):
    if user.is_authenticated():
        # ... snip - checks on groups and user ...

    return False


def check_has_permission(group=None):
    def can_user_access(user):
        return is_user_in_group(user, group)
    return user_passes_test(can_user_access, login_url=login_url)

然后您的测试可以同时模拟is_user_in_groupuser_passes_test,调用修饰函数,测试is_user_in_group 是否被正确的组调用,并测试user_passes_test 是否被调用,并使用您的模拟的返回值is_user_in_group.

【讨论】:

  • 差不多了,但我帮我弄明白了。我必须添加一个可测试的函数 is_user_in_group(user, group) 并在 check_user_access(group) 中定义的 can_user_access(user) 函数中调用它。然后我嘲笑is_user_in_group。如果您进行这些编辑,我会将其标记为正确答案。谢谢!
  • 我认为这仍然有效,所以我宁愿保持原样。用您最终使用的解决方案回答您自己的问题并没有错。
  • 我试了一下,只在导入时调用了模拟。因为我有多个使用不同组的视图,所以测试只在最后一次调用时返回。
  • 啊,我明白了。我会解决的。
  • 最后一件事是更新def is_user_in_group(user, group)。我还将 is_auth 逻辑放在 is_user_in_group 中。
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 2021-12-03
  • 2021-09-25
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多