无法在python中使用unitest模拟类方法
模块无法在python中使用unitest模拟类方法,python,python-2.7,unit-testing,mocking,python-unittest,Python,Python 2.7,Unit Testing,Mocking,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.v
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)
Pythonunittest
class
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")
断言失败了。我到底哪里出错了?您分配给
的返回值两次:
classAmock.return_value=dummyMock
classAmock.return_value=Mock()
第二个任务将完全撤销您设置dummyMock
的工作;新的Mock
实例未设置functionInClassA
属性
您不需要创建新的模拟对象;只需使用默认的返回值
属性值:
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\u的返回值,因为它总是None
(使额外的assert
总是失败)。将断言保留在assert\u调用的\u once\u with()
方法中,它将根据需要引发。很抱歉,这是一个拼写错误,将对其进行编辑。即使在编辑之后,它仍然是一样的error@gully:是的,因为您两次替换了返回值
。@Martijin即使在编辑之后,断言也失败了,但不确定我哪里出错了。这是模拟的正确方法吗?@gully:如果示例代码正确反映了真实代码,那么应该是这样。print(classAmock.mock\u调用)
show在mock上访问了什么?有名字匹配吗?将其放在断言
之前。print(classAmock.calls())显示“模拟对象没有属性”调用。提供的示例代码是真实的代码本身