如何在 Python 中模拟装饰器的最内部调用
How to mock an inner most call of a decorator in Python
我正在为我的包编写一些单元测试。假设我有以下文件:
- package/a.py
- package/tests/test_a.py
在 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
是否被正确调用。
我正在为我的包编写一些单元测试。假设我有以下文件:
- package/a.py
- package/tests/test_a.py
在 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
是否被正确调用。