如何在 Python 中模拟装饰器的最内部调用

How to mock an inner most call of a decorator in Python

我正在为我的包编写一些单元测试。假设我有以下文件:

在 a.py 中,我有 class:

class A:

    def m(x):
        def n(y):
            def o(self, z):
                pass # Parsing z
                if len(z) == x:
                    y(self, z)
            return o
        return n

在test_a.py中,我使用了from package import a指令。作为此单元测试的一部分,我想知道 y 是否被调用但不调用 y(模拟此调用)。

我该如何进行模拟?

只需传入一个模拟对象 y:

from unittest.mock import MagicMock

decorator = A.m(1)
y_mock = MagicMock()
decorated = decorator(y_mock)

self_mock = MagicMock()
decorated(self_mock, ['foo'])

y_mock.assert_called_with(self_mock, ['foo'])

上面通过调用 A.m() 创建了一个装饰器,将装饰器应用于 y_mock 对象,产生一个装饰的 'function',就像你使用行 @A.m(1)def 函数定义语句之前。

然后我为装饰器创建 2 个参数,这样您就可以轻松测试 y_mock 是否被正确调用。