使用 pytest 在单元测试中避免或绕过多个装饰器

问题描述

之前有人问过类似的问题:

functools.wraps 在装饰器中创建了一个名为 __wrapped__ 的魔法方法,它允许访问被包装的函数。但是,当您有多个装饰器时,这将返回一个内部装饰器,而不是原始函数

如何避免或绕过多个装饰器?

解决方法

要绕过或避免使用多个装饰器并访问最内部的函数,请使用此递归方法:

def unwrap(func):
    if not hasattr(func,'__wrapped__'):
        return func

    return unwrap(func.__wrapped__)

在 pytest 中,您可以在 conftest.py 中使用此函数并通过以下方式访问:

# conftest.py
import pytest

@pytest.fixture
def unwrap():
    def unwrapper(func):
        if not hasattr(func,'__wrapped__'):
            return func

        return unwrapper(func.__wrapped__)

    yield unwrapper
# my_unit_test.py
from my_module import decorated_function

def test_my_function(unwrap):
    decorated_function_unwrapped = unwrap(decorated_function)
    assert decorated_function_unwrapped() == 'something'