Python单元测试-Mock一个装饰器

场景

测试一些方法时, 可能会遇到该方法需要鉴权的情况(如login_required之类), 需要想办法绕过装饰器.

解决方案

  1. 为装饰器加开关. 在装饰器中通过读取某个配置判断是否开启该装饰器;
  2. mock掉装饰器.

前者操作起来方便, 但是在遇到不同装饰器都需要mock时, 为每个装饰器添加开关有些工作量;
而后者也有弊端, 即此次测试中, 所有测试都基于该装饰器不生效的情况下测试. 因此对于如权限等的测试, 需要添加其他测试手段(如接口测试)来完成.

本文讲述的是第二个解决方案的具体实现.

技术点

Mock装饰器与普通方法的不同之处在于, 装饰器在方法声明时就已经产生影响, 而不像普通方法被调用前mock即可, 因此需要在测试执行的最开始, 还没初始化服务端代码时就mock装饰器.

写一个自己的装饰器

from functools import wraps
def mock_decorator(*args, **kwargs):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            return f(*args, **kwargs)
        return decorated_function
    return decorator

mock原来装饰器

在测试模块的__init__.py下执行Mock操作, 即可在运行测试前先替换原来的装饰器.

from unittest import mock

mock.patch('decoretor.path.to.mock',mock_decorator).start()

参考

[1] Can I patch a Python decorator before it wraps a function?, Stack Overflow

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返...
    时间之友阅读 2,326评论 0 3
  • 在被南海事件刷屏的第二天,部门组织来了建川博物馆和金沙遗址,这一天最初是抵触,后来是感触。 在游览的过程中,我...
    受死吧子玉君阅读 341评论 0 0
  • 俗话说,到处都有美,只是缺少发现美的眼睛。世人都在追求去看某个地方的风景,其实你仔细体会:每个地方的风景都...
    被爱环绕阅读 174评论 0 0
  • 姓名:苏珊娜 我很喜欢一首诗——上邪 上邪!我欲与君相知,长命无绝衰。山无陵,江水为竭,冬雷震震,夏雨雪,天地合,...
    上邪不邪阅读 347评论 2 2