使用 mock 對象替換系統的一部分而且能獲取它們的使用狀況。html
具體的說,你能夠獲取方法/屬性的使用狀況以及它們的調用參數。也能夠指定返回值和設置屬性。python
思路是將對象設置爲 mock 對象,而後根據須要配置 mock 對象,好比返回值、異常等。ide
# -*- coding: utf-8 -*- from unittest.mock import MagicMock class ProductionClass: def method(self, arg1, arg2, key): pass thing = ProductionClass() # thing.method 如今指向一個 MagicMock 實例,當這個實例被調用時返回 3 thing.method = MagicMock(return_value=3) print(thing.method(3, 4, key='value')) # 3 thing.method.assert_called_with(3, 4, key='value')
side_effect 能夠是一個函數、iterable 或 exception(類或實例)。函數
詳情見:https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.side_effectcode
上面『設置類方法的返回值並驗證被調用過』比較囉嗦且不利用複用,因此改寫爲裝飾器或者
上下文管理器。htm
裝飾器:對象
# -*- coding: utf-8 -*- from unittest.mock import patch from strategy.module import ProductionClass @patch('strategy.module.ProductionClass.method', return_value=3) def test(method): print(ProductionClass().method(3, 4, key='value')) # 3 method.assert_called_with(3, 4, key='value') test()
上下文管理器:utf-8
# -*- coding: utf-8 -*- from unittest.mock import patch from strategy.module import ProductionClass def test(): with patch.object(ProductionClass, 'method', return_value=3) as mock_method: print(ProductionClass().method(3, 4, key='value')) # 3 mock_method.assert_called_with(3, 4, key='value') test()
對於其餘對象,好比函數,只須要將 patch
中的路徑變爲函數的路徑便可。it