首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟装饰器函数以绕过装饰器逻辑

模拟装饰器函数以绕过装饰器逻辑
EN

Stack Overflow用户
提问于 2020-10-01 12:13:05
回答 1查看 1.3K关注 0票数 2

我正在尝试为我的代码编写一些单元测试,它反过来使用了一个修饰器

代码语言:javascript
复制
import unittest
from unittest.mock import patch
from functools import wraps

def decorator(f):
    @wraps(f)
    def decorated(x):
        return f(x+1)
    return decorated

@decorator
def get_value(x):
    return x
    
class MyTestCase(unittest.TestCase):
    @patch('file.decorator', lambda f: f)
    def test_something(self):
        result = get_value(1)
        self.assertEqual(1, result)

我试图模拟修饰函数,只返回f并完全绕过修饰器逻辑部分。这是在Overriding decorator during unit test in python中提到的,但实际上并不有效。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 12:17:03

由于装饰器在定义get_value之后立即运行,所以要模拟装饰器为时已晚。不过,您可以做的(因为您使用了functools.wraps)是模拟get_value本身,并以某种方式使用get_value.__wrapped__ (原始函数)。有点像

代码语言:javascript
复制
@patch('tmp.get_value', get_value.__wrapped__)
def test_something(self):
    result = get_value(1)
    self.assertEqual(1, result)

(在本例中,我将原始代码和上面的更改一起放在tmp.py中,并以python3 -munittest tmp.py的形式运行它,从而对引用tmp.get_value进行了修补。)

但是,如果您预期需要测试未修饰的原版,那么将其保留在自己的(私有)名称下进行测试可能更简单:不需要修补。

代码语言:javascript
复制
import unittest
from functools import wraps

def decorator(f):
    @wraps(f)
    def decorated(x):
        return f(x+1)
    return decorated

def _get_value(x):
    return x

get_value = decorator(_get_value)
    
class MyTestCase(unittest.TestCase):
    def test_something(self):
        result = _get_value(1)
        self.assertEqual(1, result)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64155169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档