[英]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.