如何在 python 单元测试中修补 class 并获取修补对象的 return 值的句柄

How to patch a class in python unit test and get a handle on patched object's return value

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

下面是被测方法的样子:

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 的模拟 return 值。如果那时我以某种方式知道该值,我将能够知道 MethodUnderTest returns.

是什么

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

有人知道如何解决这个问题吗?或者,如果有更好的方法来模拟 python 像 joblib 这样的库及其方法,如加载和获取该模拟对象的句柄?

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)