Python 模拟类函数应调用一次,但调用次数=0?

Python 模拟类函数应调用一次,但调用次数=0?,python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,我要测试以下mod1.py _p = None def get_p(): global _p if _p is None: _p = P() return _p def deco(f): p = get_p() def wrapper(*args, **kwargs): p.func1() return f(*args, **kwargs) return wrapper 和p class P:

我要测试以下
mod1.py

_p = None

def get_p():
    global _p
    if _p is None:
        _p = P()
    return _p

def deco(f):
    p = get_p()
    def wrapper(*args, **kwargs):
        p.func1()
        return f(*args, **kwargs)
    return wrapper
p

class P:
    def func1(self):
        pass
我有下面的测试代码

@mock.patch('mod1.get_p')
def test_1(mocked):
    mocked.get_p = mock.Mock(P) 

    @mod1.deco()
    def test():
        pass

    test() # will call _p.func1() once

    assert mocked.func1.call_count == 1 # func1.count_count is zero
然而,它以失败告终

> assert p.func1.call_count == 1 E AssertionError: assert 0 == 1 >断言p.func1.call\u count==1 E断言错误:断言0==1
为什么呼叫计数为0?

为什么代码不起作用

通常,您会得到0个调用,因为您的装饰程序不调用
\u p.func1

您不必编写
mocked.get_p
,因为您已经伪造了它,因此您的
mocked
参数表示
mod.get_p
函数

另外,您不应该重新定义
mock
变量,因为它已经是
mock.mock

mod1
中,您有一个错误,您的
deco
装饰器是错误的,我建议您阅读更多关于python装饰器的内容

您案例的工作代码

mod1.py

P类:
def func1(自我):
通过
_p=无
def get_p():
全球
如果p为无:
_p=p()
返回
#省略了其他代码,它是一个将调用p.func1一次的装饰程序
def deco(func):
def包装(*args,**kwargs):
p=获取
p、 func1()
返回函数(*args,**kwargs)
返回包装器
test_mod1.py

导入单元测试
从unittest导入模拟
导入mod1
类TestFunc1(unittest.TestCase):
@mock.patch('mod1.get\u p')
def测试_1(自模拟):
_p_mock=mock.mock()
mocked.return\u value=\u p\u mock
@mod1.deco
def test():
通过
测试()
_p_mock.func1.assert_调用_once()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()
在openSUSE Tumbleweed上运行,Python3.8.5:

> python test_mod1.py

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

这段代码有点让人困惑,无法理解问题是什么,也无法确定您为什么要执行
mocked.get\u p=Mock
当它已经被decorator模拟或者缩进被弄乱时。我更新了我的答案,试试看,这行应该是
mocked.return\u value=\u p\u Mock.return\u value
。但是,由于同样的原因,它仍然失败。请,您能显示更多的代码吗?我确信,这一理由还没有得到检验。另外,你说要换的线路是可以的,应该可以用。