2017-06-15 46 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

相關問題