【问题标题】:Unable to mock class methods using unitest in python无法在 python 中使用 unittest 模拟类方法
【发布时间】:2016-09-22 19:33:24
【问题描述】:

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

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

【问题讨论】:

    标签: python python-2.7 unit-testing mocking python-unittest


    【解决方案1】:

    你两次分配给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() 方法,它会根据需要引发。

    【讨论】:

    • 抱歉打错了,会编辑的。即使在编辑之后它仍然是同样的错误
    • @gully:是的,因为你替换了return_value两次。
    • @Martijin 即使在编辑后断言失败,不确定我哪里出错了。这是模拟的正确方法吗?
    • @gully:应该是,如果您的示例代码正确反映了您的真实代码。 print(classAmock.mock_calls) show 在模拟上被访问了什么?有没有完全匹配的名字?放在assert之前。
    • print(classAmock.calls()) 显示'模拟对象没有属性'调用''。提供的示例代码就是真正的代码本身
    猜你喜欢
    • 2019-11-24
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多