Python mock 的使用

使用 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')

設置調用 mock 後的反作用

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

相關文章
相關標籤/搜索