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

相关文章
相关标签/搜索