1 回答
![?](http://img1.sycdn.imooc.com/54585050000156a302200220-100-100.jpg)
TA贡献1998条经验 获得超6个赞
为什么代码不起作用
通常,您会收到 0 次调用,因为您的装饰器不会调用_p.func1.
您不必编写,mocked.get_p因为您已经伪造了它,因此您的mocked参数代表mod.get_p函数。
另外,您不应该重新定义mocked变量,因为它已经是mock.Mock
如果mod1你有错误,你的deco装饰器是错误的,我建议你阅读更多关于 python 装饰器的内容。
适用于您的案例的工作代码
mod1.py
class P:
def func1(self):
pass
_p = None
def get_p():
global _p
if _p is None:
_p = P()
return _p
# other code omitted, it's a decorator which will call _p.func1 once
def deco(func):
def wrapper(*args, **kwargs):
p = get_p()
p.func1()
return func(*args, **kwargs)
return wrapper
test_mod1.py
import unittest
from unittest import mock
import mod1
class TestFunc1(unittest.TestCase):
@mock.patch('mod1.get_p')
def test_1(self, mocked):
_p_mock = mock.Mock()
mocked.return_value = _p_mock
@mod1.deco
def test():
pass
test()
_p_mock.func1.assert_called_once()
if __name__ == '__main__':
unittest.main()
在 openSUSE Tumbleweed、Python3.8.5 上运行:
> python test_mod1.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
添加回答
举报