簡體   English   中英

帶有模擬和多功能的單元測試

[英]Unit Test with Mock and Multiple Functions

我無法實例化 object,因為它是抽象的 class,所以我必須使用 mocking 來測試我的代碼。

我被告知最好通過創建一個新的mock class 來完成。

class MockMyClass(MyClass):
    def my_first_function(...):

這個想法是,然后我實例化一個MockMyClass object,我可以在其中測試私有 function。


我已閱讀 python指南並研究了其他堆棧問題 在這里,mock 背后的理論已經得到了很好的解釋。 不幸的是,我仍然對 mocking 如何在大型單元測試中用於多種功能感到迷茫。 例如:

如果我有一個 class,主代碼中的其他類從中繼承函數。 這可以采取以下形式:

class SharedFunctions(AnotherClass):
    first_function():
        #do some important calculations to generate stuff.#
        self.stuff = first_function_attribute_stuff

        return returned_first_stuff

    second_functions(returned_stuff)
        returned_second_stuff = self.stuff + returned_first_stuff
        
        return returned_second_stuff

並且 class SharedFunctions也繼承自另一個 class (注意抽象方法)的形式:

class AnotherClass():
    @abc.abstractmethod
    def one_important_universal_function(...):
        pass

我試圖為unittest代碼構建一個SharedFunctions


這是我到目前為止所嘗試的:

class MockSharedFunctions(SharedFunctions):
    def first_function(...):
        self.stuff = some value
        returned_first_stuff = given some other value

        return returned_first_stuff

    def second_function
        returned_second_stuff = another value.

        return returned_second_stuff

class TestSharedFunctions(unittest.TestCase):
    def test_first_function(self):
        # insert code #

        self.assertTrue(True)

    def test_second_function(self):
        # insert code #

        self.assetEqual(output, expected)
        self.assertTrue(True)

if __name__ == "__main__":
    unittest.main()

其中insert code已多次嘗試使用 mocking。 但是,我還沒有遇到一個明確的例子來說明如何使用模擬函數來替換其他函數,或者確認這將起作用。

感謝您的任何幫助。

一個常見問題是 mocking 函數的使用過於復雜。 您幾乎可以將它們視為另一種 class 方法。 在您的情況下, abstractmethod裝飾器可能會產生混淆。

這與您可能需要的很接近。

class MockSharedFunctions(SharedFunctions):
    def one_important_universal_function(**args):
        return 0

class TestSharedFunctions(unittest.TestCase):
    def test_first_function(self):
        mock = MockSharedFunctions()
        mock_output = firstfunction(**args)
        mock_stuff = mock.stuff

        self.assertTrue(True)
        self.assetEqual(mock_output, expected)
        self.assetEqual(mock_stuff, expected)

    def test_second_function(self):
        mock = MockSharedFunctions()
        mock.stuff = some_value
        mock_output = second_function(**args)

        self.assetEqual(mock_output, expected)
        self.assertTrue(True)

if __name__ == "__main__":
    unittest.main()

在這里,在MockSharedFunctions中,您已經繼承SharedFunctions 由於one_important_universal_function是一種抽象方法,因此需要對其進行定義。

暫無
暫無

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

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