无法在python中使用unittest模拟类方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在python中使用unittest模拟类方法相关的知识,希望对你有一定的参考价值。
模块a.ClassA
:
class ClassA():
def __init__(self,callingString):
print callingString
def functionInClassA(self,val):
return val
模块b.ClassB
:
from a.ClassA import ClassA
class ClassB():
def __init__(self,val):
self.value=val
def functionInsideClassB(self):
obj=ClassA("Calling From Class B")
value=obj.functionInClassA(self.value)
Python unittest
类
import unittest
from b.ClassB import ClassB
from mock import patch, Mock, PropertyMock,mock
class Test(unittest.TestCase):
@patch('b.ClassB.ClassA',autospec = True)
def _test_sample(self,classAmock):
dummyMock=Mock()
dummyMock.functionInClassA.return_value="mocking functionInClassA"
classAmock.return_value=dummyMock
obj=ClassB("dummy_val")
obj.functionInsideClassB()
assert dummyMock.functionInClassA.assert_called_once_with("dummy_val")
断言失败了。我到底哪里错了?
答案
您分配给return_value
两次:
classAmock.return_value=dummyMock
classAmock.return_value=Mock()
第二项任务完全取消了你设置dummyMock
的工作;新的Mock
实例没有设置functionInClassA
属性。
您不需要创建新的模拟对象;只需使用默认的return_value
属性值:
class Test(unittest.TestCase):
@patch('b.ClassB.ClassA', autospec=True)
def test_sample(self, classAmock):
instance = classAmock.return_value
instance.functionInClassA.return_value = "mocking functionInClassA"
obj = ClassB("dummy_val")
obj.functionInsideClassB()
instance.functionInClassA.assert_called_once_with("dummy_val")
你不需要断言assert_called_once_with()
的返回值,因为它始终是None
(使你的额外assert
失败,总是)。将断言留给assert_called_once_with()
方法,它会根据需要提升。
以上是关于无法在python中使用unittest模拟类方法的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 unittest 使用 python 运行 selenium
Python 3:unittest.mock如何为特定输入指定不同的返回值?
使用unittest.mock在python中修补SMTP客户端