1 回答

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
添加回答
舉報