簡體   English   中英

如何在python單元測試中修補類並獲取修補對象返回值的句柄

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

我正在使用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裝飾器。 我的測試如下所示:

從模擬導入unittest從導入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的模擬值是什么。

有人知道如何解決這個問題嗎? 或者是否有更好的方法來模擬python庫(如joblib)及其方法(如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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM