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
。但是,由于同样的原因,它仍然失败。请,您能显示更多的代码吗?我确信,这一理由还没有得到检验。另外,你说要换的线路是可以的,应该可以用。