先记录今天用到的,以后再整理。
假设要测试的方法:
def target():
wb = openpyxl.load_workbook('test')
ws = wb['sheet']
ws.values
...
可以看到,target中使用了openpyxl读取excel文件,然后处理,测试的时候不想再读取文件了,需要mock下openpyxl.
我需要先创建一个类,要求支持以[]的方式读取值,而且返回的values必须是一个iterator,每一项是个元组:
class Values:
@property
def values(self):
for k, v in self._values:
yield k, v
@values.setter
def values(self, values):
self._values = values
class LoadWorkbook:
# 因为要mock的方法接收了一个参数,所以这里也需要接收一个参数
def __init__(self, workbook):
pass
# 支持以[]方式读取数据
def __getitem__(self, item):
return Values()
然后在test中使用:
from unitest.mock import patch
...
@patch('openpyxl.load_workbook')
def test_target(mock_load_workbook):
# mock_load_workbook会代替target方法中的load_workbook
# 给mock_load_workbook添加副作用,当target中执行load_workbook('test')时
# 会执行LoadWorkbook('test')
mock_load_workbook.side_effect = LoadWorkbook
...