无法在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模拟类方法的主要内容,如果未能解决你的问题,请参考以下文章

Python unittest 模拟 pyspark 链

无法使用 unittest 使用 python 运行 selenium

Python 3:unittest.mock如何为特定输入指定不同的返回值?

使用unittest.mock在python中修补SMTP客户端

使用 unittest.mock 在 python 中修补 SMTP 客户端

Python unittest mock:是不是可以在测试时模拟 __init__ 的默认参数的值?