python mock的简单使用

先记录今天用到的,以后再整理。

假设要测试的方法:

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
    ...
    

猜你喜欢

转载自blog.csdn.net/Crazy_zh/article/details/113731780