如何在本地使用Pytest模拟Mssparkutils?
如何在本地模拟Mssparkutils进行测试
方案1:使用unittest.mock.patch模拟全局对象
由于生产函数直接引用了全局的mssparkutils,你可以通过patch针对函数所在模块模拟该对象(假设生产函数位于my_module.py),无需修改生产代码。
示例测试代码:
from unittest.mock import patch, MagicMock import my_module # 导入生产函数所在的模块 def test_list_files(): # 构建模拟的mssparkutils层级结构 mock_fs = MagicMock() mock_fs.ls.return_value = ["file1.txt", "file2.csv"] # 预设ls方法的返回值 mock_mssparkutils = MagicMock() mock_mssparkutils.fs = mock_fs # 替换生产模块中的mssparkutils对象 with patch('my_module.mssparkutils', mock_mssparkutils): my_module.list_files("/test/path") # 验证调用逻辑是否符合预期 mock_fs.ls.assert_called_once_with("/test/path")
方案2:使用pytest的monkeypatch注入模拟对象
借助pytest的monkeypatch fixture,在测试执行前将模拟的mssparkutils注入到生产函数所在模块的命名空间中:
from unittest.mock import MagicMock import my_module import pytest def test_list_files(monkeypatch): # 创建模拟的fs和mssparkutils对象 mock_fs = MagicMock() mock_fs.ls.return_value = ["test_file.parquet"] mock_mssparkutils = MagicMock() mock_mssparkutils.fs = mock_fs # 将模拟对象注入生产模块 monkeypatch.setattr(my_module, 'mssparkutils', mock_mssparkutils) # 执行测试并验证 my_module.list_files("/data/path") mock_fs.ls.assert_called_once_with("/data/path")
核心注意事项
- 必须针对生产函数所在的模块进行模拟操作,而非全局命名空间,Python的模块导入机制会按模块命名空间解析变量引用。
- 所有模拟逻辑都在测试代码中完成,完全不影响生产环境的代码结构。
内容的提问来源于stack exchange,提问作者LightningStack575
相关产品推荐
相关产品推荐

