Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在python中使用unitest模拟类方法_Python_Python 2.7_Unit Testing_Mocking_Python Unittest - Fatal编程技术网

无法在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)
Python
unittest
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())显示“模拟对象没有属性”调用。提供的示例代码是真实的代码本身