为何Mock HuggingFace datasets库无法生效?
问题根源:Mock路径不正确
你遇到的问题不是HuggingFace datasets库不可Mock,而是Mock的目标路径不对。Python的Mock机制依赖模块的命名空间,你需要patch的是load_data函数实际引用的load_dataset对象,而非库顶层的datasets.load_dataset。
修正步骤
假设你的主函数代码在my_module.py文件中:
# my_module.py from datasets import load_dataset def load_data(token: str): dataset = load_dataset("MYORG/MYDATASET", use_auth_token=token, split="train") return dataset
测试代码里的patch路径需改为my_module.load_dataset,而非datasets.load_dataset:
# test_my_module.py import datetime from my_module import load_data def test_data(mocker): token_test = "test_token" mocked_dataset = [ {'image': [[0.5, 0.3], [0.7, 0.9]], 'timestamp': datetime.date(2023, 1, 1)}, ] # 修正patch路径为函数所在模块中的load_dataset引用 mocker.patch('my_module.load_dataset', return_value=mocked_dataset) result = load_data(token_test) assert len(result) == 1
为什么原路径不行?
当你在my_module.py中执行from datasets import load_dataset时,Python会把load_dataset函数对象复制到my_module的命名空间里。你的测试代码patch的是datasets模块下的原函数,但load_data实际调用的是my_module命名空间里的副本,因此原Mock不会生效。
额外验证技巧
可以在测试中添加断言,验证Mock是否被正确调用:
def test_data(mocker): token_test = "test_token" mocked_dataset = [ {'image': [[0.5, 0.3], [0.7, 0.9]], 'timestamp': datetime.date(2023, 1, 1)}, ] mock_load_dataset = mocker.patch('my_module.load_dataset', return_value=mocked_dataset) result = load_data(token_test) assert len(result) == 1 # 验证Mock被调用过,且参数符合预期 mock_load_dataset.assert_called_once_with("MYORG/MYDATASET", use_auth_token=token_test, split="train")
内容的提问来源于stack exchange,提问作者Fsanna
相关产品推荐
相关产品推荐

