如何在 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)
我正在 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)