2017-06-15 61 views
0

我在Python 2.7使用模拟2.0.0图书馆如何修补在Python单元测试类和修补对象的返回值获得一个句柄

下面是测试方法看起来像测试类的方法:

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进口JOBLIB 进口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库和它们的方法(比如加载并获取该模拟对象的句柄)?

回答

0
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) 
+0

这工作得很好。所以我在代码中遗漏的是补丁中的错误路径。我一直没有完成,直到.load,即我试图存根的joblib下的方法名称。然后,mockJoblibLoad.return_value =“somemockvalue”也可以正常工作。谢谢 – Hary