gpt4 book ai didi

python - 如何模拟装饰函数

转载 作者:太空狗 更新时间:2023-10-29 16:56:36 24 4
gpt4 key购买 nike

出于测试原因,我需要能够模拟在其他地方使用的装饰函数的内部/原始函数:

在 mydecorator.py 中:

def my_decorator(f):
def wrapped_f():
print "decorated"
f()
return wrapped_f


@my_decorator
def function_to_be_mocked():
print 'original'


def function_to_be_mocked_undecorated():
print 'original'


def run_decorated():
function_to_be_mocked()


def run_undecorated():
decorated_funtion = my_decorator(function_to_be_mocked_undecorated)
decorated_funtion()

如您所见,我有几个原始函数 function_to_be_mocked 的版本,一个带有装饰器 my_decorator,另一个是“裸”。运行器函数 run_decorated() 调用 function_to_be_mocked 的装饰版本,run_undecorated() 调用未装饰版本并“手动”应用装饰器。两者的结果是一样的:

decorated
original

现在我想测试 runner 函数,但我需要模拟原始函数 function_to_be_mocked 并且还应该装饰模拟版本:

import unittest
import mydecorator
from mock import patch

def mock_function():
print 'mockified'

class Test(unittest.TestCase):

@patch('mydecorator.function_to_be_mocked_undecorated')
def test_undecorated_mocked(self, mock_function_to_be_mocked_undecorated):
mydecorator.function_to_be_mocked_undecorated = mock_function
mydecorator.run_undecorated()
assert 1==0

@patch('mydecorator.function_to_be_mocked')
def test_decoratorated_mocked(self, mock_function_to_be_mocked):
mydecorator.function_to_be_mocked = mock_function
mydecorator.run_decorated()
assert 1==0

对于未修饰的版本 test_undecorated_mocked,这按预期工作:

decorated
mockified

但是装饰版给出了:

mockified

所以装饰器消失了。

是否有可能使装饰版本以与未装饰版本相同的方式工作,其中装饰器是“手动”应用的?

我试图在装饰器中暴露内部函数,但没有成功。

我看到了这个问题How do you mock a function which has decorator apply to it in a unit test?但这对我没有帮助。

最佳答案

Python 在加载模块时应用装饰器,因此在 test_decoratorated_mocked 中将 function_to_be_mocked 设置为 mock_function 确实会将该函数更改为未装饰的函数。

如果你想模拟function_to_be_mocked,你需要再次手动添加装饰器:

mydecorator.function_to_be_mocked = mydecorator.my_decorator(mock_function)

关于python - 如何模拟装饰函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19812570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com