无法在 python 中使用 unitest 模拟 class 方法

Unable to mock class methods using unitest in python

模块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")

断言失败。我到底哪里错了?

您分配给 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() 的 return 值,因为它总是 None(使你的额外 assert 总是失败)。将断言留给 assert_called_once_with() 方法,它会根据需要提出。