【问题标题】:How to patch a class in python unit test and get a handle on patched object's return value如何在 python 单元测试中修补类并获取修补对象返回值的句柄
【发布时间】:2017-11-17 09:46:02
【问题描述】:

我正在使用 Mock 2.0.0 库在 Python 2.7 中测试一个类的方法

下面是被测方法的样子:

from sklearn.externals import joblib

    class ClassUnderTest():

        def MethodUnderTest(self, path, myDict):

            newDict= {}

            for key, val in myDict.iteritems():
                retVal= (joblib.load(path + val))
                newDict[key] = retVal

            return newDict

现在,我的意图是测试 MethodUnderTest 但模拟 joblib.load 而不是在现实中调用它。因此,为了实现这一点,我使用了 Mock 库中可用的 @patch 装饰器。我的测试如下:

导入单元测试 从模拟导入MagicMock,补丁 从 sklearn.externals 导入作业库 导入 ClassUnderTest

class TestClass(unittest.TestCase):

    @patch('ClassUnderTest.joblib')
    def test_MethodUnderTest(self, mockJoblibLoad):

        dict = {"v1": "p1.pkl"}        
        retVal = ClassUnderTest.MethodUnderTest("whateverpath", dict)

现在,如果我必须针对某些东西断言 retVal 的键和值,那是基于 joblib.load 的模拟返回值是什么。如果我以某种方式知道该值,我将能够知道 MethodUnderTest 返回什么。

这里的问题是,当使用 @patch 装饰器模拟时,我不知道 joblib.load 的模拟值是什么。

有人知道如何解决这个问题吗?或者是否有更好的方法来模拟诸如 joblib 之类的 python 库及其方法,例如加载并获取该模拟对象的句柄?

【问题讨论】:

    标签: python python-unittest python-mock


    【解决方案1】:
    class TestClass(unittest.TestCase):
    
        @patch('path.to.module.joblib.load')  # You path is probably wrong here
        def test_MethodUnderTest(self, mockJoblibLoad):
            # Set the side_effect if you want to return different things on 
            # each iteration e.g. mockJoblib.side_effect = [...]
            mockJoblibLoad.return_value = ...  
            test_dict = {"v1": "p1.pkl"}        
            expect = {"v1": mockJoblibLoad.return_value}
            actual = ClassUnderTest.MethodUnderTest("whateverpath", dict)
            self.assertEqual(expect, actual)
    

    【讨论】:

    • 这很好用。所以我在代码中缺少的是补丁中的错误路径。直到 .load ,即我试图存根的 joblib 下的方法名称,我才一直拥有它。然后, mockJoblibLoad.return_value = "somemockvalue" 也可以正常工作。谢谢
    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2022-07-09
    • 1970-01-01
    • 2019-01-09
    • 2010-11-01
    相关资源
    最近更新 更多