Python|单元测试对象补丁 |第一组
问题是编写单元测试并且需要将补丁应用到选定的对象,以便断言它们是如何在测试中使用的(例如,关于使用某些参数调用、访问选定属性等的断言)。
为此,可以使用unittest.mock.patch()
函数来帮助解决这个问题。这有点不寻常,但是patch()
可以用作装饰器、上下文管理器或独立使用。
代码 #1:使用
unittest.mock.patch
作为装饰器from unittest.mock import patch
import example
@patch('example.func')
def test1(x, mock_func):
# Uses patched example.func
example.func(x)
mock_func.assert_called_with(x)
代码 #2:使用unittest.mock.patch
作为装饰器
with patch('example.func') as mock_func:
example.func(x)
mock_func.assert_called_with(x)
代码 #3:使用unittest.mock.patch
手动修补。
p = patch('example.func')
mock_func = p.start()
example.func(x)
mock_func.assert_called_with(x)
p.stop()
代码 #4:堆叠装饰器和上下文管理器以修补多个对象
@patch('example.func1')
@patch('example.func2')
@patch('example.func3')
def test1(mock1, mock2, mock3):
...
def test2():
with patch('example.patch1') as mock1, \
patch('example.patch2') as mock2, \
patch('example.patch3') as mock3:
...
patch()
通过获取具有您提供的完全限定名称的现有对象并将其替换为新值来工作。然后在修饰函数或上下文管理器完成后恢复原始值。默认情况下,值会替换为 MagicMock 实例。代码 #5:示例
x = 42
with patch('__main__.x'):
print(x)
print (x)
输出 :
42