如何在python单元测试中修补一个类并处理修补对象的返回值



我正在使用 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装饰器。我的测试如下所示:

导入单元测试 从模拟导入魔术模拟,补丁 来自 sklearn.externals import joblib 导入类测试下测

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返回什么。

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

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

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)

最新更新