求救! python3.7 如何 mock.patch 一个装饰器装饰过的函数??

发布于 2021-04-22 09:30:17

如题:python3.7 如何 mock.patch 一个装饰器装饰过的函数??网上有关于如何 mock 装饰器的例子,但是都跑不通。 比如这个例子就不行 https://www.jianshu.com/p/70a0bc3e3dc4

# yyy.py
import functools


def timeit(func):
   @functools.wraps(func)
   def wrap(*args, **kwargs):
       print('timeit')
       return func(*args, **kwargs)

   return wrap


@timeit
def foo():
   print('foo')
# xxx.py
import functools
from unittest import TestCase, main
from unittest import mock


def mock_timeit(func):
    @functools.wraps(func)
    def wrap(*args, **kwargs):
        print('mock timeit')
        return func(*args, **kwargs)

    return wrap


mock.patch('yyy.timeit', mock_timeit).start()

import yyy


class YYYTestCase(TestCase):

    def test_yyy(self):
        print(yyy.foo())  # 应该输出 mock timeit


if __name__ == '__main__':
    main()

查看更多

关注者
0
被浏览
600
no1xsyzy
no1xsyzy 2021-04-22
这家伙很懒,什么也没写!

标题陈述有误?
你这是在 mock 一个装饰器吧

简单的情况下,你不能。
yyy:timeit():wrap 已经生成并从 yyy:timeit() 里买定离手了。
除非你去魔改 yyy:timeit():wrap 的字节码

当然,如果你高兴的话可以把每一个被 yyy:timeit() 装饰过的函数全部替换为 xxx:mock_timeit() 修饰的版本。
还有一种,就是修改 yyy:timeit() 的实现方式,把它从一个函数转变为一个 class,其中定义了 yyy:timeit.__around__(self, func)(args, *kwargs) 。

1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览