我想模拟Pandas函数read_csv
,在我的代码中,它是由一个高阶函数动态返回的,但似乎pytest patch
并不真正允许它.
import pandas as pd
format_read_func_mapping = {"csv": pd.read_csv, "parquet": pd.read_parquet}
def my_func(s3_path, file_format):
read_func = format_read_func_mapping[file_format]
df = read_func(f"{s3_path}")
return df
当我运行我的单元测试时,我有以下内容
from unittest.mock import patch
@patch(f"{MODULE_PATH}.pd.read_csv")
def test_my_func(self, mock_read_csv):
mock_read_csv.side_effect = [my_test_data_frame]
my_func(dummy_s3_path, "csv")
我预计测试将使用模拟并返回我的测试数据,但它没有,它实际上调用了pandas.read_csv
来try 从dummy_s3_path
读取.
但是,如果我不从映射中动态返回pd.read_csv
,只需在my_func
中直接使用pd.read_csv(f"{s3_path}")
,模拟就可以很好地工作.
这是最热的极限吗?或者我嘲笑的方式是不正确的?
谢谢.