如何Mock非标准库h5py的文件属性读取操作以完成测试?
模拟h5py的attrs属性实现测试需求
核心思路是只mock测试所需的最小调用链,不需要复刻完整的h5py数据结构,只需要让h5py.File返回的对象拥有符合要求的attrs属性即可,用Python标准库的unittest.mock就能实现。
实现代码(unittest框架)
import unittest from unittest.mock import patch, MagicMock import h5py class TestH5AttrReading(unittest.TestCase): @patch('h5py.File') def test_attr_short_name(self, mock_h5_file): # 模拟attrs对象,让它支持字典式[]取值 mock_attrs = MagicMock() # 指定key对应的返回值 mock_attrs.__getitem__.return_value = 'expected_output' # 构建mock的h5文件对象,挂载attrs属性 mock_file_instance = MagicMock() mock_file_instance.attrs = mock_attrs # 适配with语句,让__enter__返回我们的mock对象 mock_h5_file.return_value.__enter__.return_value = mock_file_instance # 执行待测试的代码逻辑 with h5py.File('/my/data.h5') as f: self.assertEqual(f.attrs['short_name'], 'expected_output') if __name__ == '__main__': unittest.main()
实现代码(pytest框架)
如果用pytest,写法会更简洁:
from unittest.mock import patch, MagicMock import h5py def test_h5_attr_short_name(): with patch('h5py.File') as mock_h5_file: mock_attrs = MagicMock() mock_attrs.__getitem__.return_value = 'expected_output' mock_file_instance = MagicMock() mock_file_instance.attrs = mock_attrs mock_h5_file.return_value.__enter__.return_value = mock_file_instance with h5py.File('/my/data.h5') as f: assert f.attrs['short_name'] == 'expected_output'
扩展:模拟多属性取值
如果需要同时模拟多个key的返回值,可以用side_effect自定义逻辑:
def mock_attr_get(key): attr_map = { 'short_name': 'expected_output', 'version': 'v1.0', 'author': 'test_user' } return attr_map[key] mock_attrs.__getitem__.side_effect = mock_attr_get
内容的提问来源于stack exchange,提问作者Rachel W
相关产品推荐
相关产品推荐

