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